鸿蒙:将项目的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 = 4096
      let 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 += len
        fs.writeSync(dest.fd, buf, { offset: off, length: len })
        off = off + len
        if ((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.filesDir
    this.showAlertDialog("沙箱目录路径:" + this.sandboxDirectoryPath)
  }

  // 缓存目录路径
  getCacheDirectoryPath() {
    this.cacheDirectoryPath = this.context.cacheDir
    this.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 = 4096
      let 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 += len
        fs.writeSync(dest.fd, buf, { offset: off, length: len })
        off = off + len
        if ((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)

  }
}

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

相关推荐
李游Leo34 分钟前
《HarmonyOS 7 ArkGraphics 3D 空间设计开发实战》08:动画、生命周期与SpaceRoom工程化收尾【鸿蒙心迹】
3d·harmonyos
-madongyu-1 小时前
HCIE-GaussDB V2.0 笔试考点总览:模块权重、核心要点与高频数字速记
数据库·华为·gaussdb
轻口味1 小时前
HarmonyOS 7 新特性2:音频编创——轻音台里的降噪、环绕与格式转换
华为·音视频·harmonyos·鸿蒙·音频编创
极客范儿1 小时前
华为HCIP网络工程师认证—DHCP、NAT和 PPPOE
网络·华为
m0_738185822 小时前
Flutter 鸿蒙化实战:flutter_blue_plus 适配 OpenHarmony,蓝牙扫描连接开箱即用
flutter·华为·harmonyos·鸿蒙
李游Leo2 小时前
HarmonyOS 7 + ArkUI + Adaptive Layout 学习笔记:折叠屏多形态布局适配与窗口状态响应机制【鸿蒙心迹】
笔记·学习·harmonyos
贾伟康2 小时前
【HarmonyOS 7新能力|067】LTPO可变帧率实战:让动画流畅而静态页面省电
harmonyos·arkts·低功耗·ltpo·可变帧率
LucianaiB2 小时前
华为云码道 AI 编程实战:我用 CodeArts 智能体打造了一款 HarmonyOS 游戏化专注应用「智办 ZhiBan」
人工智能·ai·华为云·harmonyos·codearts·材料
李游Leo3 小时前
HarmonyOS 7 + ArkTS + Image Kit 学习笔记:图像超分处理链路与 PixelMap 数据流实践【鸿蒙心迹】
笔记·学习·harmonyos
xq95273 小时前
JSON to ArkTS Model 王者归来
harmonyos