【HarmonyOS NEXT】鸿蒙应用压缩和解压处理

打印 上一主题 下一主题

主题 977|帖子 977|积分 2933

【HarmonyOS NEXT】鸿蒙应用压缩和解压处理

一、前言

鸿蒙应用中经常会遇到使用压缩包的场景。比方H5的离线包逻辑,需要提前将资源包下载到当地,进行压缩操纵获取资源。
二、方案思路

鸿蒙中提供@ohos.zlib (Zip模块)进行压缩和解压的处理。
需要注意的是,操纵路径需要在沙箱中,那如果压缩包在项目工程资源文件夹中,需要提前对压缩包文件进行拷贝到沙箱路径的操纵。
zlib.compressFile 进行压缩
zlib.decompressFile 进行解压
三、源码示例


  1. import { zlib, BusinessError } from '@kit.BasicServicesKit';
  2. import { fileIo as fs } from '@kit.CoreFileKit';
  3. import { common } from '@kit.AbilityKit';
  4. import { util } from '@kit.ArkTS';
  5. import { buffer } from '@kit.ArkTS';
  6. @Entry
  7. @Component
  8. struct ZipTestPage {
  9.   private TAG: string = "ZipTestPage";
  10.   @State mZipTestContent: string = "";
  11.   // 指定的待解压缩文件的文件路径,文件后缀需要以.zip结尾。文件路径必须为沙箱路径,沙箱路径可以通过context获取
  12.   private inFile = '/xx/xxx.zip';
  13.   // 指定的解压后的文件夹路径,文件夹目录路径需要在系统中存在,不存在则会解压失败。
  14.   // 路径必须为沙箱路径,沙箱路径可以通过context获取
  15.   // 如果待解压的文件或文件夹在解压后的路径下已经存在,则会直接覆盖同名文件或同名文件夹中的同名文件。多个线程同时解压文件时,outFile不能相同。
  16.   private outFileDir = '/xxx';
  17.   // 解压的配置参数。
  18.   private options: zlib.Options = {
  19.     // 压缩率 默认压缩等级。
  20.     level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION
  21.   };
  22.   aboutToAppear(): void {
  23.     // 准备zip到沙箱路径下
  24.     this.copyRawFileToLocal();
  25.     // 填充待解压文件路径和解压后的文件路径
  26.     this.setting();
  27.   }
  28.   private setting(){
  29.     let pathDir: string = getContext().filesDir;
  30.     console.info(this.TAG, "setting pathDir: " + pathDir);
  31.     this.inFile = pathDir + '/test.zip';
  32.     console.info(this.TAG, "setting inFile: " + this.inFile);
  33.     this.outFileDir =  pathDir;
  34.     console.info(this.TAG, "setting outFileDir: " + this.outFileDir);
  35.   }
  36.   /**
  37.    * 点击解压
  38.    */
  39.   onUnZip = async ()=>{
  40.     try {
  41.       console.info(this.TAG, "onUnZip start");
  42.       // 解压文件,解压的结果回调
  43.       zlib.decompressFile(this.inFile, this.outFileDir, this.options, (errData: BusinessError) => {
  44.         if (errData !== null) {
  45.           console.error(this.TAG, `errData is errCode:${errData.code}  message:${errData.message}`);
  46.         }
  47.         console.info(this.TAG, "onUnZip done");
  48.         // 解压成功后,则去输出的路径下outFileDir,读取文件
  49.         let fileTarget = fs.openSync(this.outFileDir + "/test.txt",  fs.OpenMode.READ_ONLY);
  50.         let size = fs.statSync(fileTarget.fd).size;
  51.         console.info(this.TAG, "onUnZip size: " + size);
  52.         let bufferRes = new ArrayBuffer(size);
  53.         let readLen = fs.readSync(fileTarget.fd, bufferRes);
  54.         fs.closeSync(fileTarget);
  55.         console.info(this.TAG, "onUnZip readLen: " + readLen);
  56.         let decoder = util.TextDecoder.create('utf-8');
  57.         let temp = new Uint8Array(bufferRes);
  58.         let result = decoder.decodeToString(temp);
  59.         console.info(this.TAG, "onUnZip text: " + result);
  60.         this.mZipTestContent = result;
  61.         // let pathDir: string = getContext().filesDir;
  62.         // let filePath = pathDir + "/test.txt";
  63.         // let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
  64.         // let arrayBuffer = new ArrayBuffer(4096);
  65.         // fs.read(file.fd, arrayBuffer, (err: BusinessError, readLen: number) => {
  66.         //   if (err) {
  67.         //     console.error(this.TAG,"read failed with error message: " + err.message + ", error code: " + err.code);
  68.         //   } else {
  69.         //     console.info(this.TAG, "read file data succeed");
  70.         //     let buf = buffer.from(arrayBuffer, 0, readLen);
  71.         //     console.info(this.TAG, `The content of file: ${buf.toString()}`);
  72.         //   }
  73.         //   fs.closeSync(file);
  74.         // });
  75.       })
  76.     } catch (errData) {
  77.       let code = (errData as BusinessError).code;
  78.       let message = (errData as BusinessError).message;
  79.       console.error(this.TAG, `errData is errCode:${code}  message:${message}`);
  80.     }
  81.   }
  82.   private copyRawFileToLocal() {
  83.     let context = getContext(this) as common.UIAbilityContext; // 获取设备A的UIAbilityContext信息
  84.     try {
  85.       let val: Uint8Array = context.resourceManager.getRawFileContentSync("test.zip");
  86.       console.info(this.TAG, "getRawFileContentSync done");
  87.       let pathDir: string = context.filesDir; // /data/storage/el2/base/haps/entry/files
  88.       console.info(this.TAG, "pathDir: " + pathDir);
  89.       // 待拷贝文件沙箱路径
  90.       let filePath: string = pathDir + '/test.zip';
  91.       console.info(this.TAG, "filePath: " + filePath);
  92.       // 若文件不存在,则创建文件。
  93.       let fileTarget = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  94.       console.info(this.TAG, "file done");
  95.       let writeLen = fs.writeSync(fileTarget.fd, val.buffer as ArrayBuffer);
  96.       console.info(this.TAG, "write data to file succeed and size is:" + writeLen);
  97.       fs.closeSync(fileTarget);
  98.     } catch (error) {
  99.       let code = (error as BusinessError).code;
  100.       let message = (error as BusinessError).message;
  101.       console.error(this.TAG,`getRawFileContentSync failed, error code: ${code}, message: ${message}.`);
  102.     }
  103.   }
  104.   build() {
  105.     RelativeContainer() {
  106.       Text("点击解压,内容: " + this.mZipTestContent)
  107.         .id('ZipTestPageHelloWorld')
  108.         .fontSize(50)
  109.         .fontWeight(FontWeight.Bold)
  110.         .alignRules({
  111.           center: { anchor: '__container__', align: VerticalAlign.Center },
  112.           middle: { anchor: '__container__', align: HorizontalAlign.Center }
  113.         })
  114.         .onClick(this.onUnZip)
  115.     }
  116.     .height('100%')
  117.     .width('100%')
  118.   }
  119. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表