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

鸿蒙:将项目的rawfile目录下全部文件拷贝到app沙箱目录

1. 前言

  1. rawfile是鸿蒙项目中的放置资源文件夹,在该文件夹中,我们可以放图片、音乐、视频、文本等,都是可以的。
  2. 不过app访问,只能根据一个个的文件名来访问,如果想实现将整个rawfile文件夹下的文件全部拷贝到沙箱,就需要我们提前在rawfile文件夹下将全部文件打成一个压缩包。
  3. 通过zlib接口,将文件解压到沙箱目录。这便实现了拷贝流程。

2. 参考文档

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-resource-manager#closerawfiledescriptordeprecatedhttps://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-resource-manager#closerawfiledescriptordeprecated

https://developer.huawei.com/consumer/cn/doc/architecture-guides/common-v1_26-ts_93-0000002306064776https://developer.huawei.com/consumer/cn/doc/architecture-guides/common-v1_26-ts_93-0000002306064776

3. 核心思路

  1. 点击 "获取沙箱目录路径":获取并显示应用沙箱目录路径
  2. 点击 "获取缓存目录路径":获取并显示应用缓存目录路径
  3. 点击 "获取 rawfile 目录的压缩文件":从 rawfile 目录读取 "rawfile.zip" 的文件描述符
  4. 点击 "拷贝压缩文件到缓存目录":将 rawfile 中的压缩文件通过流操作复制到缓存目录
  5. 点击 "将压缩文件解压到沙箱目录":将缓存目录中的压缩文件解压到沙箱目录,并关闭文件描述符
  6. 点击 "获取沙箱目录的文件列表":读取并显示沙箱目录下的所有文件名称

4. 核心代码

 // 拷贝压缩文件到缓存目录async copyCompressedFileToCacheDirectory() {try {let dest = fs.openSync(this.cacheDirectoryPath + "/rawfile.zip", fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)let bufsize = 4096let buf = new ArrayBuffer(bufsize)let off = 0, len = 0, readedLen = 0/*** 通过buffer将rawfile文件内容copy到沙箱路径*/while (len = fs.readSync(this.data!.fd, buf, { offset: this.data!.offset + off, length: bufsize })) {readedLen += lenfs.writeSync(dest.fd, buf, { offset: off, length: len })off = off + lenif ((this.data!.length - readedLen) < bufsize) {bufsize = this.data!.length - readedLen}}await fs.close(dest.fd)} catch (e) {console.log("拷贝失败" + e)}this.showAlertDialog("压缩文件拷贝成功")}// 将压缩文件解压到沙箱目录async unzipCompressedFileToSandboxDirectory() {// 对沙箱路径下的压缩文件进行解压await zlib.decompressFile(this.cacheDirectoryPath + "/rawfile.zip", this.sandboxDirectoryPath)await this.context.resourceManager.closeRawFd("rawfile.zip")console.info("解压完成")this.showAlertDialog("解压文件完成")}

5. 运行效果

6. 完整代码

Index.ets

import { fileIo as fs } from '@kit.CoreFileKit'
import { resourceManager } from '@kit.LocalizationKit'
import { zlib } from '@kit.BasicServicesKit'@Entry
@ComponentV2
struct Index {context = this.getUIContext().getHostContext()!@Local sandboxDirectoryPath: string = ""@Local cacheDirectoryPath: string = ""@Local data: resourceManager.RawFileDescriptor | null = null// 弹窗showAlertDialog(mes: string) {this.getUIContext().showAlertDialog({ message: mes })}// 获取沙箱目录路径getSandboxDirectoryPath() {this.sandboxDirectoryPath = this.context.filesDirthis.showAlertDialog("沙箱目录路径:" + this.sandboxDirectoryPath)}// 缓存目录路径getCacheDirectoryPath() {this.cacheDirectoryPath = this.context.cacheDirthis.showAlertDialog("缓存目录路径:" + this.cacheDirectoryPath)}// 获取rawfile目录的压缩文件getCompressedFileFromRawfileDirectory() {this.data = this.context.resourceManager.getRawFdSync("rawfile.zip")this.showAlertDialog("压缩文件data获取成功")}// 拷贝压缩文件到缓存目录async copyCompressedFileToCacheDirectory() {try {let dest = fs.openSync(this.cacheDirectoryPath + "/rawfile.zip", fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)let bufsize = 4096let buf = new ArrayBuffer(bufsize)let off = 0, len = 0, readedLen = 0/*** 通过buffer将rawfile文件内容copy到沙箱路径*/while (len = fs.readSync(this.data!.fd, buf, { offset: this.data!.offset + off, length: bufsize })) {readedLen += lenfs.writeSync(dest.fd, buf, { offset: off, length: len })off = off + lenif ((this.data!.length - readedLen) < bufsize) {bufsize = this.data!.length - readedLen}}await fs.close(dest.fd)} catch (e) {console.log("拷贝失败" + e)}this.showAlertDialog("压缩文件拷贝成功")}// 将压缩文件解压到沙箱目录async unzipCompressedFileToSandboxDirectory() {// 对沙箱路径下的压缩文件进行解压await zlib.decompressFile(this.cacheDirectoryPath + "/rawfile.zip", this.sandboxDirectoryPath)await this.context.resourceManager.closeRawFd("rawfile.zip")console.info("解压完成")this.showAlertDialog("解压文件完成")}// 获取沙箱目录的文件列表getFileListInSandboxDirectory() {let files = fs.listFileSync(this.sandboxDirectoryPath,);this.showAlertDialog(files.join("\n"))}build() {Column({ space: 100 }) {Text("请依次点击下方按钮").fontSize(28).fontWeight(FontWeight.Bold)Column({ space: 20 }) {Text("沙箱目录路径:" + this.sandboxDirectoryPath)Button("1、获取沙箱目录路径").onClick(() => {this.getSandboxDirectoryPath()})Text("缓存目录路径:" + this.cacheDirectoryPath)Button("2、获取缓存目录路径").onClick(() => {this.getCacheDirectoryPath()})Text("压缩文件data长度:" + this.data?.length)Button("3、获取rawfile目录的压缩文件").onClick(() => {this.getCompressedFileFromRawfileDirectory()})Button("4、拷贝压缩文件到缓存目录").onClick(() => {this.copyCompressedFileToCacheDirectory()})Button("5、将压缩文件解压到沙箱目录").onClick(() => {this.unzipCompressedFileToSandboxDirectory()})Button("6、获取沙箱目录的文件列表").onClick(() => {this.getFileListInSandboxDirectory()})}}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}

觉得有帮助可以点赞或收藏

http://www.dtcms.com/a/478615.html

相关文章:

  • SQL sever数据库--第一次作业
  • 青春励志剧《我的鸵鸟先生》杀青,陈若尧唱演结合,演绎反派摇滚歌手
  • CCF-GESP 等级考试 2025年9月认证C++四级真题解析
  • 旅游网站建设水平评价做网站总结
  • 网站模版建设工具中国域名拍卖网
  • 做旅游网站的引言自字网站建设教程
  • [工作流节点26] 流程性能优化与大规模并发场景实战指南
  • 十二、kubernetes 1.29 之 存储 Volume、pv/pvc
  • 精品网站建设价格网页制作的软件
  • 做卫浴软管的网站网站做好后怎么更新内容
  • 如何在合法合规范围内获取 sitekey 参数?有哪些公开/私有获取途径
  • JDK17先进特性
  • Spring Boot接入链路追踪(Micrometer Tracing+Zipkin) 一
  • Jenkins Share Library教程 —— 开发入门
  • SpringBoot读取自定义格式的Nacos配置
  • WordPress建站怎么交付青岛seo网络推广
  • 江西个人网站备案小制作小发明简单做法
  • 在Qt中实现SwitchButton(开关按钮)
  • day9_elementPlus2
  • qiankun子应用使用elementUI操作反馈图标不显示
  • Vue3.0: v-model 组件双向绑定学习文档 (v3.4 前后对比 + TypeScript)
  • 中山哪里有做微网站的做ppt图片用的网站
  • 『 QT 』QT窗口坐标体系详解
  • 服务器里怎么建设网站网站开发网站设计素材
  • 从多个数据源(CSV, Excel, SQL)自动整合数据
  • 智慧零售天气预知可视化监控平台
  • C++设计模式_结构型模式_享元模式Flyweight
  • 网站备案名称能重复吗微官网怎么制作
  • SpringBoot + MyBatis 注解开发入门实践
  • Java EE初阶--多线程