【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的位置

相关推荐
molihuan1 小时前
最新 spine 4.3 flutter 适配鸿蒙
flutter·动画·harmonyos·鸿蒙·spine
qizayaoshuap1 小时前
# 鸿蒙 HarmonyOS 应用开发实战(第33期)|喝水提醒(Water Reminder)— 可视化水杯与进度动画
华为·harmonyos
程序员黑豆2 小时前
鸿蒙应用开发之父子组件传参:@Param、@Event、@Once 装饰器详解与实战
前端·harmonyos
FF2501_940228582 小时前
HarmonyOS应用开发实战:猫猫大作战-AVPlayer 音视频播放
harmonyos·鸿蒙
达子6664 小时前
第17章_HarmonyOs开发图解之 媒体会话管理
华为·harmonyos·媒体
A富得流油的咸鸭蛋5 小时前
安卓鸿蒙面试
android·面试·harmonyos
程序员黑豆5 小时前
鸿蒙应用开发之状态变化通知:@Watch 装饰器详解与实战
前端·harmonyos
用户0934077735146 小时前
HarmonyOS WPS Open SDK 快速入门:HAR 装上就能打开文档吗
typescript·harmonyos
熊猫钓鱼>_>6 小时前
ArkTS 基础入门:从零搭建第一个交互页面
华为·架构·交互·ts·harmonyos·arkts·鸿蒙
三声三视6 小时前
DevEco Code 让 AI 写 ArkTS,enum 反向查表真机翻车——我换成 typeof + as const 后清净了
人工智能·harmonyos·arkts·鸿蒙