HarmonyOS 拷贝文件至沙盒

拷贝rawfile目录下文件至沙盒路径出现问题,以template_datamask文件为例, 文件实际大小为6275968,流程如下,

1.使用getRawFd获取到rawfile目录下template_datamask文件,读取文件大小为6275968。

2.使用copyFileSync复制到沙盒路径。

3.使用read读取沙盒路径下template_datamask文件,读取文件大小为40418788,此时读取的文件大小是错误的,同时这个文件也无法解析。

此流程在sdk3.1上是可以正确读取文件大小的也可以正常读取文件内容,在sdk4.1上出现此问题

HarmonyOS
2024-12-27 15:02:08
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
superinsect

resourcemanager拿到的fd,resource所有rawfile压缩在一块的, 得用fs.read接口指定offset和length去读出来,然后再从buffer把东西写进最终文件,此时文件大小是正常的。

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);
  }
}
分享
微博
QQ
微信
回复
2024-12-27 17:54:41
相关问题
HarmonyOS路径视频导出相册
203浏览 • 1回复 待解决
HarmonyOS NAPI层怎么读写文件
425浏览 • 1回复 待解决
HarmonyOS 无权限导出文件
267浏览 • 1回复 待解决
HarmonyOS dlopen加载的so文件失败
219浏览 • 1回复 待解决
HarmonyOS 加载RN路径资源文件
494浏览 • 1回复 待解决
HarmonyOS 安装包读取文件
222浏览 • 1回复 待解决
HarmonyOS 内购如何开启测试
317浏览 • 1回复 待解决
HarmonyOS ArkTS 如何访问路径
846浏览 • 1回复 待解决
HarmonyOS Video组件如何播放视频
260浏览 • 1回复 待解决
HarmonyOS 应用路径视频无法播放
532浏览 • 1回复 待解决
有谁知道如何访问路径
844浏览 • 1回复 待解决