当前位置: 首页 > 科技观察

OpenHarmony——文件管理系列中的复制单个文件_0

时间:2023-03-13 18:52:03 科技观察

更多内容请访问:与华为官方共同建立的鸿蒙技术社区https://ost.51cto.com前言是没错,我们可以直接调用文件管理接口来复制单个文件。使用fileio.copyFile输入要复制的文件的路径和目标文件夹的路径来复制单个文件,但是如果直接使用这个方法的话,我们如何获取复制单个文件的进度呢?整体思路,我们可以把复制单个文件的整个过程比作复制一桶水的过程:我们当前的任务是复制一桶水,我们需要获取复制一桶水的进度。首先我们第一眼就会看到,这个桶是什么颜色的,红色的还是黄色的?然后我们需要打开水桶的盖子,看看水里有什么,然后我们将看到的记录在脑子里。这时候我们再拿一个一模一样的空桶,把刚刚记在心里的水加进去。同理:首先接收到的应该是我们需要复制的文件的绝对路径,这样我们就可以通过字符串切割得到文件的格式:是txt,是ppt还是png格式?文件格式对应于上例中桶的颜色。然后,我们需要调用fileio.openSync打开要复制的文件,读取内容后先创建一个缓存区newArrayBuffer作为存储位置,然后通过调用fileio.readSync(cacheZone。然后,我们将创建一个与复制文件相同格式的新空文件。同样,我们需要打开这个空文件并调用fileio.writeSync将缓冲区的内容写入这个文件。我希望这样一个解释和类比可以让读者对单个文件的复制有一个深刻的印象,上面的过程就是复制文件的整体过程,那么在这个过程中我们如何获取文件的进度呢,这里我选择控制写入速度通过控制每次读取的内容,假设要复制的文件大小为1G,每次只读取1M长度的数据流,那么每次只写入1M长度的数据流,需要循环写1024次,这里期间,此时不断获取新文件大小与复制文件大小的比值,从而实现进度数据。代码实现//复制单个文件duplicate1(path){letdir=fileio.openSync(path)letindex=path.lastIndexOf(".")letind=path.lastIndexOf("/")letitem={size:fileio.statSync(path).size,path:path,文件名:path.slice(ind+1,index),fileType:path.slice(index+1)}letcurrentPath=path.slice(0,ind)让duplicationSize=item.sizeletduplicatedSize=0letfd=fileio.openSync(item.path,0o100|0o2,0o666)//经过实验,在使用fileio.readSyncapi之前,必须先写..这是一个小bug让num=fileio.writeSync(fd,"");fileio.closeSync(fd);leti=0letprocessor=0lettimer=setInterval(()=>{//我们需要对边界值做一些处理,以防我们复制的文件大小是我们设置读取长度的整数倍if(i>(Math.floor((item.size-1)/READ_LENGTH)+1)){clearInterval(timer)}else{//打开复制的文件letfd2=fileio.openSync(item.path,0o100|0o2,0o666)//创建缓冲区letbuf=newArrayBuffer(READ_LENGTH)//设置读取长度,读取位置letnum1=fileio.readSync(fd2,buf,{position:READ_LENGTH*i,length:READ_LENGTH})//关闭复制的文件fileio.closeSync(fd2);//创建一个与文件格式相同的空文件letcopypath=currentPath+'/'+item.fileName+'*.'+项目.文件类型;//openanewfileletcopyfd=fileio.openSync(copypath,0o100|0o2,0o666)//写入,位置和读复制文件时一样,length的长度要和读文件时一样复制文件fileio.writeSync(copyfd,buf,{position:i*READ_LENGTH,length:num1});//关闭新文件fileio.closeSync(copyfd)//获取当前新文件的大小duplicatedSize=fileio.statSync(copypath).sizeletprocessValue=duplicatedSize//新文件的大小除以的大小复制的文件即progress=(processValue/duplicationSize)*100log("this.duplicatedSize:",duplicatedSize)this.getProcessor(processor)i+=1}},1)}除了控制长度通过控制写入来控制读取的进度除了按长度计算进度之外,我们还有另一种获取进度的方法:一次读取所有内容,但分段写入在该方法中,我们需要将缓冲区中存储的内容转换成数组格式,将数组分成若干等份的小数组,然后将小数组的每一部分转换回缓冲区的格式后再写入到新的转到空文件。这种方法如果用来拷贝小文件,效率上可能没什么区别,但是如果用来拷贝大文件,效率会很低,所以不推荐使用。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com