HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决

HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决

【问题现象】

使用resourceManager.getRawFd获取rawfile目录下资源文件描述符fd,再使用fileIo.copyfile拷贝到沙箱目录后,文件大小及内容都异常。

代码示例如下:

copyRawFileToSdcard(context: common.Context) {
  let destRoot = context.filesDir;
  let srcFileName = "test_1.txt" // rawFile下的文件名
  let destFilePath = destRoot + "/test/copy_" + srcFileName;
  console.log("copyRawFileToSdcard filepath : " + destFilePath)
  // 创建文件目录
  fileIo.mkdir(destRoot + "/test").catch((exp: Error) => {
    // 可能目录已存在或者没有权限
    console.log("copyRawFileToSdcard mkdir fail : " + JSON.stringify(exp))
  }).then(async () => {
    // 创建目录成功
    console.log("copyRawFileToSdcard mkdir success ")
    // 获取rawFile的fd
    let data: resourceManager.RawFileDescriptor = await context.resourceManager.getRawFd(srcFileName);
    fileIo.copyFile(data.fd, destFilePath, 0).catch((exp: Error) => {
      // 文件拷贝失败
      console.log("copyRawFileToSdcard write exception " + JSON.stringify(exp))
    }).then(() => {
      // 文件拷贝成功
      console.log("copyRawFileToSdcard write success")
    })
  })
}

原始文件与拷贝后文件对比如下:

点击放大

【背景知识】

  • rawfile目录属于应用工程的资源目录,该目录下的文件目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。可以通过指定文件路径和文件名访问。
  • 可以通过resourceManager.getRawFileContent获取rawfile目录下的文件内容。

【定位思路】

rawfile目录下文件属于应用工程的资源文件,获取的resourceManager.RawFileDescriptor中的资源fd并非文件系统的文件描述符fd,不能直接通过Core File Kit(文件基础服务)去访问和管理,需要通过@ohos.resourceManager (资源管理)模块访问。

【解决方案】

  1. 使用resourceManager.getRawFileContent获取rawfile目录下文件内容;
  2. 使用fileIo.createStreamSync获取目标文件流fileStream,再使用fileStream.writeSync写入。

代码示例如下:

copyRawFileToSdcard(context: common.Context) {
  let destRoot = context.filesDir;
  let srcFileName = "test_1.txt" // rawFile下的文件名
  let destFilePath = destRoot + "/test/copy_" + srcFileName;
  console.log("copyRawFileToSdcard filepath : " + destFilePath)
  // 创建文件目录
  fileIo.mkdir(destRoot + "/test").catch((exp: Error) => {
    // 可能目录已存在或者没有权限
    console.log("copyRawFileToSdcard mkdir fail : " + JSON.stringify(exp))
  }).then(async () => {
    // 创建目录成功
    console.log("copyRawFileToSdcard mkdir success ")
    context.resourceManager.getRawFileContent(srcFileName, (error: BusinessError, value: Uint8Array) => {
      if (error != null) {
        console.error("error is " + error);
      } else {
        let rawFile = value;
        let fileStream = fileIo.createStreamSync(destFilePath, "w+");
        fileStream.writeSync(rawFile.buffer);
        fileStream.close();
        // 文件拷贝成功
        console.log("copyRawFileToSdcard write success")
      }
    });
  })
    .catch((exp: Error) => {
      // 文件拷贝失败
      console.log("copyRawFileToSdcard write exception " + JSON.stringify(exp))
    })
}

最终的文件对比完全相同:

点击放大

【总结】

  1. 使用resourceManager.getRawFd获取rawfile目录下资源文件描述符fd,并非文件管理系统中的文件描述符fd,两者指向的并非同一文件。
  2. rawFile目录下的文件拷贝需要使用resourceManager.getRawFileContent获取其文件内容,再写入到对应文件中。

更多关于HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,rawfile目录下的文件拷贝到沙箱后出现大小和内容错误可能是由于文件路径或读取方式不当导致的。确保使用正确的API进行文件拷贝,如使用ResourceManagergetRawFile方法获取文件资源,再使用FileFileOutputStream进行写入操作。

检查文件路径是否正确,确保目标路径在沙箱内。如果文件较大,可能需要分块读取和写入,避免一次性操作导致内存溢出或数据丢失。另外,确认文件编码格式是否一致,防止因编码问题导致内容错误。

回到顶部