HarmonyOS如何高效拷贝rawfile下面的文件到files目录下?

let fd = context.resourceManager.getRawFDSync("a.txt").fd; 
fs.copyFileSync(fd, context.filesDir+"/a.txt") 

结果不是拷贝a.txt,而是拷贝了从a开始的整个har包。

阅读 593
1 个回答

resourcemanager拿到的fd不支持copyfile(所有rawfile被压缩在一块), 得用fs.read接口指定offset和length去读出来,然后再从buffer把东西写进最终文件。参考demo如下:

import fs from '@ohos.file.fs';
@Entry
@Component
struct TestError {
  @State message: string = 'Hello World'
  @State rawfilePath:string = "config.txt";
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button(`将文件${this.rawfilePath}复制`)
          .fontSize(16)
          .fontWeight(FontWeight.Bold)
          .margin(5)
          .onClick(() => {
            getContext(this).resourceManager.getRawFd(this.rawfilePath).then(file => {
              this.copy2file(file)
            }).catch((err) => {
              console.log(JSON.stringify(err));
            })
          })
      }
      .width('100%')
    }
    .height('100%')
  }
  async copy2file(item) {
    try {
      let dstPath = getContext(this).filesDir+'/test.txt'
      this.saveFileToCache(item, dstPath)
    } catch(e) {
      console.log(`RawFile#copy2file() error : ${JSON.stringify(e)}`)
    }
  }
  saveFileToCache(file, path) {
    // 创建缓存文件(当前是覆盖式创建)
    let cacheFile = fs.openSync(
      path,
      fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE | fs.OpenMode.TRUNC)
    let buffer = new ArrayBuffer(4096);
    let currentOffset = file.offset;
    let lengthNeedToReed = file.length;
    let readOption = {
      offset: currentOffset,
      length: lengthNeedToReed > buffer.byteLength ? 4096 : lengthNeedToReed
    }
    while(true) {
      // 读取buffer容量的内容
      let readLength = fs.readSync(file.fd, buffer, readOption);
      // 写入buffer容量的内容
      fs.writeSync(cacheFile.fd, buffer, {length:readLength})
      // 判断后续内容 修改读文件的参数
      if (readLength < 4096) {
        break;
      }
      lengthNeedToReed -= readLength;
      readOption.offset += readLength;
      readOption.length = lengthNeedToReed > buffer.byteLength ? 4096 : lengthNeedToReed;
    }
    fs.close(cacheFile);
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进