HarmonyOS 关于resource保存至沙盒文件格式的问题

根据之前的问题已经实现了文件保存到沙盒,但是目前可能是由于读取文件格式和配置导致文件保存之后非原始文件,目前使用的我们公司加密后的.mnn模型文件,以下是代码.

想问下,这段代码如何修改能实现对.mnn文件的无损复制到沙盒目录下,比如流的方式读取在保存

/**
 * 初始化文件
 */
private async initFiles() {
  try {
    getContext(this).resourceManager.getRawFileContent("etcard_obj_moblie.mnn", (error, value) => {
      if (error != null) {
        console.log("error is " + error);
      } else {
        let rawFile = value;
        let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM: true });
        let rawFileString = textDecoder.decodeWithStream(rawFile, { stream: false });
        let context = getContext(this);
        //沙箱路径
        let filePath = context.cacheDir + "/etcard_obj_moblie.mnn";
        let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
        let writeLen = fs.writeSync(file.fd, rawFileString);
        //复制
        let srcPath = filePath;
        let dstPath = context.filesDir + "/etcard_obj_moblie.mnn";
        fs.copyFile(srcPath, dstPath).then(() => {
          console.info("copy file succeed");
        }).catch((err: BusinessError) => {
          console.error("copy file failed with error message: " + err.message + ", error code: " + err.code);
        });
        console.info("write data to file succeed and size is:" + writeLen);
        fs.closeSync(file);
      }
    });
  } catch (error) {
    console.error(`callback getRawFileContent failed, error code: ${error.code}, message: ${error.message}.`)
  }
}
HarmonyOS
5天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

文件内容不一致是因为fd是指整个文件,需要使用offset来确定所需文件的位置,使用length来限制读取的大小

getContext(this).resourceManager.getRawFd("test.txt", async (error, value) => {
  if (error != null) {
    console.error(`callback getRawFd failed error code: ${error.code}, message: ${error.message}.`);
  } else {
    let fd = value.fd;
    let offset = value.offset;
    let length = value.length;

    let filesDir = getContext(this).filesDir;
    // 打开文件流
    let inputStream = fs.fdopenStreamSync(fd, "r+");
    // let inputStream = fs.createStreamSync(filesDir + '/test.txt', 'r+');
    let outputStream = fs.createStreamSync(filesDir + '/etcard_obj_moblie.txt', "w+");
    // 以流的形式读取源文件内容并写入目的文件
    let bufSize = 4096;
    let readSize = 0;
    let buf = new ArrayBuffer(bufSize);

    class Option {
      public offset: number = 0;
      public length: number = bufSize;
    }

    let option = new Option();
    option.offset = value.offset;
    option.length = value.length;
    let readLen = await inputStream.read(buf, option);
    readSize += readLen;
    while (readLen > 0) {
      await outputStream.write(buf);
      option.offset = readSize + value.offset;
      option.length = value.length - readSize;
      readLen = await inputStream.read(buf, option);
      readSize += readLen;
    }
    // 关闭文件流
    inputStream.closeSync();
    outputStream.closeSync();
  }
});
分享
微博
QQ
微信
回复
5天前
相关问题
HarmonyOS 拷贝文件
83浏览 • 1回复 待解决
HarmonyOS路径视频导出相册
74浏览 • 1回复 待解决
HarmonyOS NAPI层怎么读写文件
117浏览 • 1回复 待解决
HarmonyOS 加载RN路径资源文件
245浏览 • 1回复 待解决
HarmonyOS Resource文件如何保存到沙箱
114浏览 • 1回复 待解决
HarmonyOS 保存网络图片图库问题
328浏览 • 1回复 待解决
HarmonyOS ArkTS 如何访问路径
269浏览 • 1回复 待解决
HarmonyOS 内购如何开启测试
52浏览 • 1回复 待解决
HarmonyOS 应用路径视频无法播放
172浏览 • 1回复 待解决
关于视频流格式和如何保存咨询
1928浏览 • 1回复 待解决