HarmonyOS鸿蒙Next中资源文件拷贝到设备沙盒下异常

HarmonyOS鸿蒙Next中资源文件拷贝到设备沙盒下异常

执行以上代码,将文件拷贝到沙盒下,但是2kb的文件,最后写到沙盒下变成3M了

6 回复

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

import fs from '@ohos.file.fs';
@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);
  }

参考链接

更多关于HarmonyOS鸿蒙Next中资源文件拷贝到设备沙盒下异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢,不过后面改成将文件放在resfile文件夹,直接用getContext().resourceDir+"/文件名"来获取到文件在沙盒下的路径了。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

已解决。

改成将文件放在resfile文件夹,直接用getContext().resourceDir+"/文件名"来获取到文件在沙盒下的路径了

在HarmonyOS鸿蒙Next中,资源文件拷贝到设备沙盒下异常可能涉及以下几个方面:

  1. 权限问题:确保应用已获得必要的文件读写权限。HarmonyOS中,应用访问沙盒外的文件系统需要申请相应的权限。

  2. 路径问题:检查拷贝操作中使用的路径是否正确。沙盒路径通常位于/data/storage/el1/bundle下,具体路径可能因应用和用户不同而有所差异。

  3. 文件系统限制:HarmonyOS对文件系统的访问有一定限制,确保操作的文件类型和大小在系统允许的范围内。

  4. API使用:使用正确的API进行文件操作。例如,ohos.file.fs模块提供了文件系统操作的相关接口,确保使用这些接口进行文件拷贝。

  5. 异常处理:在代码中加入异常处理机制,捕获并记录可能的错误信息,便于排查问题。

  6. 日志分析:通过查看系统日志和应用日志,分析拷贝操作失败的具体原因。

  7. 设备兼容性:不同设备可能存在兼容性问题,确保在目标设备上进行充分测试。

  8. 系统更新:确保设备和系统版本为最新,避免因系统Bug导致的问题。

通过以上步骤,可以逐步排查和解决资源文件拷贝到设备沙盒下的异常问题。

在HarmonyOS鸿蒙Next中,资源文件拷贝到设备沙盒下异常可能由以下原因导致:

  1. 权限问题:确保应用已申请并获取了必要的文件读写权限,如ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA

  2. 路径错误:检查拷贝的目标路径是否正确,确保路径指向设备的沙盒目录,如/data/storage/el2/base/

  3. 文件系统限制:某些文件可能被系统保护或锁定,导致无法拷贝。确保文件未被其他进程占用或锁定。

  4. 存储空间不足:检查设备存储空间是否足够,确保有足够的空间进行文件拷贝。

  5. API调用错误:确认使用的API是否正确,如FileManagerFile类的方法。

建议逐步排查以上问题,或查看系统日志获取更详细的错误信息。

回到顶部