OpenHarmony——文件管理系列3(单个文件的复制) 原创 精华
作者:焦以焜
前言
诚然,对于单个文件的复制我们可以直接调用文件管理的接口去实现,使用fileio.copyFile
输入待复制文件的路径与目标文件夹的路径就可以实现对单个文件的复制,但是如果直接使用这个方法的话,我们如何获取到单个文件复制时的进度呢?
整体思路
我们可以把整个复制单个文件的过程比作一个复制一桶水的过程:
我们现在的任务是复制一桶水,且需要获取到复制一桶水的进度。首先,我们首先会第一眼看到,这是一个什么颜色的水桶,红色的还是黄色的?然后我们需要打开水桶的盖子,看里面的水内容是什么,接着我们会把我们看见的内容记在我们的脑海里。这时候我们再去拿一个一模一样的空桶,往里面加入刚才记在我们脑海中的水。
同理:我们首先接受到的应该是我们需要复制文件的绝对路径,这样我们就能通过裁剪字符串的方式,获取到这个文件的格式:是txt,是ppt还是png格式呢?文件格式对应着上述例子的水桶的颜色。然后,我们需要调用fileio.openSync
打开需要复制的文件,先创建一个缓存区new ArrayBuffer
作为读取内容后存放的位置,再通过调用fileio.readSync
将我们读取到的内容存放在我们的脑海(缓存区)里。然后,我们会创建一个新的空的,与被复制文件相同格式的文件,同样,我们需要打开这个空文件之后,调用fileio.writeSync
来将缓存区的内容写入到这个文件中。
希望这样的解释与类比可以让读者对单个文件的复制有一个比价深刻的印象。
上述的流程是整体的复制文件的流程,那我们该如何在这个过程中获取到文件的进度呢?在这里我选择的是通过控制每次读取的内容,来控制写入的速度。假设一个要被复制的文件大小为1G,每次我们都只读取1M长度的数据流,那么我们每次都只写入这1M长度的数据流,我们就需要循环写入1024次,在此期间不停的获取此时新文件的大小与被复制文件的大小的比例,这样一来,进度的数据就实现了。
代码实现
除了通过控制读取的长度控制写入的长度来计算进度以外,我们还有一种获取进度的方式:一次性读取全部的内容,但是分段写入。这种方法我们需要先将缓存区存储的内容转为数组的格式,将该数组分为若干等份的小数组,再将每一份小数组转换回缓存区的格式,才可以写入到新的空文件当中去。这种方法如果用于小文件的复制可能看不出效率的区别,但是如果是大文件复制的情况效率就会很低,所以我们不推荐使用。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
一直都对如何获取到文件的进度挺感兴趣的,感谢作者讲解。
大佬牛批,学到了学到了
666,学习了。
大佬更新快点,我想看全部的
学习了