【HarmonyOS】鸿蒙将资源文件夹Resource-RawFile下的文件存放到沙箱目录下

【HarmonyOS】鸿蒙将资源文件夹Resource-RawFile下的文件存放到沙箱目录下

一、问题背景

应用开发中,我们经常会遇到一些文件原先是放在资源文件夹 rawfile下,但是逻辑处理时,需要转移到本地沙箱才能操作。这种情况下,就需要将将资源文件夹Resource-RawFile下的文件存放到沙箱目录下。

二、鸿蒙资源文件和沙箱的概念

在鸿蒙中,应用仅能保存文件到"应用文件目录"下,根据目录的使用规范和注意事项来选择将数据保存到不同的子目录中。

这样的设定与安卓和苹果目前一致。应用沙箱的概念,可以保证数据访问的安全性。

在鸿蒙系统中,文件存储分为不同的域,如应用内部存储(应用私有目录)和外部存储(公共目录等)。应用内部存储是应用私有的,其他应用通常无法访问。外部存储可以在用户授权的情况下被多个应用访问。

注意:

不要使用绝对路径拼接系统文件路径,否则可能导致后续应用版本因应用文件路径变化导致不兼容问题。应该是用context去动态获取。

而rawfile是一种资源文件类型,通常在应用开发过程中作为原始文件被打包进应用的资源目录。它在 APK(安卓应用安装包)或者鸿蒙应用安装包(HAP)中是只读的。

三、解决方案思路

1.首先我们需要通过getRawFileContentSync读取rawfile下目标文件的内容val

dart 复制代码
      let val: Uint8Array = context.resourceManager.getRawFileContentSync("test.zip");

2.之后创建本地沙箱的文件对象fileTarget

dart 复制代码
  let pathDir: string = context.filesDir; // /data/storage/el2/base/haps/entry/files
      console.info(this.TAG, "pathDir: " + pathDir);
      // 待拷贝文件沙箱路径
      let filePath: string = pathDir + '/test.zip';
      console.info(this.TAG, "filePath: " + filePath);
      // 若文件不存在,则创建文件。
      let fileTarget = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

3.将val目标文件内容写入文件对象即可

dart 复制代码
      let writeLen = fs.writeSync(fileTarget.fd, val.buffer as ArrayBuffer);

最后记得关闭fs

dart 复制代码
 fs.closeSync(fileTarget);

完整源码

dart 复制代码
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';

@Entry
@Component
struct SandboxPage {
  private TAG: string = "SandboxPage";

  onCopyRawFileToLocal = ()=>{
    let context = getContext(this) as common.UIAbilityContext; // 获取设备A的UIAbilityContext信息
    try {
      let val: Uint8Array = context.resourceManager.getRawFileContentSync("test.zip");
      console.info(this.TAG, "getRawFileContentSync done");
      let pathDir: string = context.filesDir; // /data/storage/el2/base/haps/entry/files
      console.info(this.TAG, "pathDir: " + pathDir);
      // 待拷贝文件沙箱路径
      let filePath: string = pathDir + '/test.zip';
      console.info(this.TAG, "filePath: " + filePath);
      // 若文件不存在,则创建文件。
      let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
      console.info(this.TAG, "file done");
      let writeLen = fs.writeSync(file.fd, val.buffer as ArrayBuffer);
      console.info(this.TAG, "write data to file succeed and size is:" + writeLen);
      fs.closeSync(file);
    } catch (error) {
      let code = (error as BusinessError).code;
      let message = (error as BusinessError).message;
      console.error(this.TAG,`getRawFileContentSync failed, error code: ${code}, message: ${message}.`);
    }

  }

  build() {
    RelativeContainer() {
      Text("点击拷贝zip到本地沙箱下")
        .id('SandboxPageHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(this.onCopyRawFileToLocal)
    }
    .height('100%')
    .width('100%')
  }
}

验证zip拷贝成功:
1. IDE右下角找到 Device File Browser

2.根据你的app包名,找到zip的位置

相关推荐
网络豆10 小时前
开源鸿蒙平台 CMP 三方库「navigation-compose-extended」适配全流程
华为·开源·harmonyos
2601_9494800611 小时前
开源鸿蒙平台 CMP 三方库「multiplatform-markdown-renderer」适配全流程
华为·开源·harmonyos
威哥爱编程14 小时前
HarmonyOS 7 Agent 开发实战 10:降级兜底与重试
agent·harmonyos
威哥爱编程14 小时前
HarmonyOS 7 Agent 开发实战 11:并发多会话隔离
agent·harmonyos
威哥爱编程14 小时前
HarmonyOS 7 Agent 开发实战 12:人机协同与人工接管
agent·harmonyos
鸿蒙开发14 小时前
鸿蒙动态表单实战:用 @hmkit/validator 处理条件必填与错误联动
harmonyos
行者-全栈开发15 小时前
【共创稿事节】HarmonyOS 三方库工程化集成:从 ohpm 引入到三方库鸿蒙化的完整闭环
harmonyos·鸿蒙·har·三方库·ohpm·框架适配
网络豆16 小时前
开源鸿蒙平台 CMP 三方库「tanstack-table-kmp」适配全流程
华为·开源·harmonyos
贾伟康17 小时前
【共创稿事节】食材百科页的懒加载改造:LazyForEach、IDataSource 与缓存窗口的三次迭代
性能优化·harmonyos·arkts·lazyforeach·列表加载
SZYSK17 小时前
一套人员主数据,三套事务:通行、消费、人证比对如何分事件类型
物联网·算法·harmonyos