HarmonyOS 预置包解压

我们有预置一些离线包,格式为zip包格式,比如profile.zip文件,需要解压到/data/app/el2/100/base/包名/files中,如何操作,有相应demo吗

HarmonyOS
7天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

如果是在resources/rawfile,通过getRawFd拷贝文件,请参考:

/**
 * 通过fd来进行拷贝,避免文件过大的内存占用问题
 * data.fd是hap包的fd,data.offset表示目标文件在hap包中的偏移,data.length表示目标文件的长度
 */
this.context.resourceManager.getRawFd("tool.zip", (err, data) => {
  if (err != null) {
    console.error(err.message)
    return
  }
  let sanboxPath = this.context.filesDir
  console.log("沙箱路径:" + sanboxPath)
  let tmpPath = fs.mkdtempSync(sanboxPath + "/XXXXXX")
  let filePath = this.context.tempDir + "/tmp.zip"
  console.log("压缩文件路径:" + filePath)
  let dest = fs.openSync(filePath, 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(data.fd, buf, { offset: data.offset + off, length: bufsize })) {
    readedLen += len
    fs.writeSync(dest.fd, buf, { offset: off, length: len })
    off = off + len
    if ((data.length - readedLen) < bufsize) {
      bufsize = data.length - readedLen
    }
  }
  fs.close(dest.fd)
  // 对沙箱路径下的压缩文件进行解压
  zlib.decompressFile(filePath, sanboxPath, {}, (err, data) => {
    if (err != null) {
      console.error(err.message)
    } else {
      console.log("decompress succeed")
    }
  })
  this.context.resourceManager.closeRawFd("tool.zip", (err, data) => {
    if (err != null) {
      console.log(err.message)
    } else {
      console.log("close success")
    }
  })
分享
微博
QQ
微信
回复
6天前
相关问题
HarmonyOS 离线 下载解压
766浏览 • 0回复 待解决
supermap iManager 解压即用
2476浏览 • 1回复 待解决
HarmonyOS支持解压加密压缩吗?
120浏览 • 1回复 待解决
是否支持CFCA证书预置
715浏览 • 1回复 待解决
如何解压有密码的压缩
1890浏览 • 0回复 待解决
zip解压是在主线程还是IO线程
1776浏览 • 1回复 待解决
js api 如何读取预置的json文件?
7393浏览 • 1回复 待解决
HarmonyOS 无法解压文件
71浏览 • 1回复 待解决
请问混合应用如何预置
4859浏览 • 1回复 待解决
实现文件解压缩和数据流解压
1570浏览 • 1回复 待解决
HarmonyOS 如何解压gzip格式文件?
71浏览 • 1回复 待解决
zlib.decompressFile()解压报错如何分析
2048浏览 • 1回复 待解决