HarmonyOS 鸿蒙Next 如何将bundle中的文件拷贝到沙盒中

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何将bundle中的文件拷贝到沙盒中

resource中有rawfile文件,假设叫config.db 现在需要将它拷贝到el2的files目录中,应该如何实现 拷贝过程内存占用应该尽量低,即不应该将文件内容完整读取到内存后再写入

2 回复

可以参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-local-file-manager-1-V5 或参考这个看看:

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);

  }

}

更多关于HarmonyOS 鸿蒙Next 如何将bundle中的文件拷贝到沙盒中的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,将bundle中的文件拷贝到沙盒中,可以通过以下步骤实现:

  1. 获取Bundle中的文件路径:首先,你需要通过ResourceManager获取bundle中文件的URI,然后转换成文件路径。HarmonyOS提供了相应的API来访问bundle资源。

  2. 创建沙盒目标路径:确定沙盒中目标文件的存储位置,例如,你可以选择在应用的私有存储目录下创建新的文件或目录。

  3. 文件拷贝操作:使用文件IO操作API,如FileChannelFileOutputStreamFileInputStream,将bundle中的文件内容读取并写入到沙盒中的目标文件。

  4. 权限管理:确保你的应用有权限访问和写入沙盒目录。通常,写入私有存储目录不需要额外的权限,但如果是访问外部存储或特定目录,则可能需要申请相应的权限。

示例代码片段(伪代码,具体API需查阅HarmonyOS开发文档):

String bundleFilePath = getResourceFilePath(context, resourceUri);
String sandboxPath = getSandboxFilePath(context, targetFileName);
copyFile(bundleFilePath, sandboxPath);

请注意,上述代码为示意性描述,具体实现需参考HarmonyOS提供的API文档和示例代码。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部