当前位置: 首页 > news >正文

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

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

一、问题背景

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

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

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

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

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

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

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

三、解决方案思路

在这里插入图片描述

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

      let val: Uint8Array = context.resourceManager.getRawFileContentSync("test.zip");

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

  let pathDir: string = context.filesDir; // /data/storage/el2/base/haps/entry/filesconsole.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目标文件内容写入文件对象即可

      let writeLen = fs.writeSync(fileTarget.fd, val.buffer as ArrayBuffer);

最后记得关闭fs

 fs.closeSync(fileTarget);

完整源码

import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';

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/filesconsole.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的位置
在这里插入图片描述

http://www.lryc.cn/news/510514.html

相关文章:

  • Vue项目中env文件的作用和配置
  • 在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
  • 机器人C++开源库The Robotics Library (RL)使用手册(三)
  • Photoshop启动错误:找不到MSVCP140.dll的多步骤解决指南
  • mac中idea菜单工具栏没有git图标了
  • 学习threejs,PerspectiveCamera透视相机和OrthographicCamera正交相机对比
  • C#数学相关开发性能优化方法
  • 【前沿 热点 顶会】AAAI 2025中与目标检测有关的论文
  • APP投放的归因框架设计
  • 职业生涯记录-1
  • 江苏捷科云:可视化平台助力制造企业智能化管理
  • 【ES6复习笔记】Promise对象详解(12)
  • 01 Oracle 基本操作
  • C语言基础:指针(数组指针与指针数组)
  • 本地部署 LLaMA-Factory
  • Web前端基础知识(三)
  • 数据库设计问题记录
  • mac_录屏
  • 【Java-tesseract】OCR图片文本识别
  • redis cluster集群
  • 解锁高效密码:适当休息,让学习状态满格
  • 代码随想录算法训练营第十一天-150.逆波兰表达式求值
  • C++ 泛编程 —— 嵌套使用模板类
  • 【WebGIS】Cesium:GLTF数据加载
  • 【面经】25届 双非本科 字节跳动 北京 四年的总结
  • 抖去推碰一碰系统技术源码/open SDK转发技术开发
  • goview——vue3+vite——数据大屏配置系统
  • 中间件xxl-job安装
  • 【第2篇】 Python与数据库基础
  • CTFHUB-web进阶-php