【HarmonyOS NEXT】鸿蒙应用压缩和解压处理
一、前言
鸿蒙应用中经常会遇到使用压缩包的场景。比方H5的离线包逻辑,需要提前将资源包下载到当地,进行压缩操纵获取资源。
二、方案思路
鸿蒙中提供@ohos.zlib (Zip模块)进行压缩和解压的处理。
需要注意的是,操纵路径需要在沙箱中,那如果压缩包在项目工程资源文件夹中,需要提前对压缩包文件进行拷贝到沙箱路径的操纵。
zlib.compressFile 进行压缩
zlib.decompressFile 进行解压
三、源码示例

- import { zlib, BusinessError } from '@kit.BasicServicesKit';
- import { fileIo as fs } from '@kit.CoreFileKit';
- import { common } from '@kit.AbilityKit';
- import { util } from '@kit.ArkTS';
- import { buffer } from '@kit.ArkTS';
- @Entry
- @Component
- struct ZipTestPage {
- private TAG: string = "ZipTestPage";
- @State mZipTestContent: string = "";
- // 指定的待解压缩文件的文件路径,文件后缀需要以.zip结尾。文件路径必须为沙箱路径,沙箱路径可以通过context获取
- private inFile = '/xx/xxx.zip';
- // 指定的解压后的文件夹路径,文件夹目录路径需要在系统中存在,不存在则会解压失败。
- // 路径必须为沙箱路径,沙箱路径可以通过context获取
- // 如果待解压的文件或文件夹在解压后的路径下已经存在,则会直接覆盖同名文件或同名文件夹中的同名文件。多个线程同时解压文件时,outFile不能相同。
- private outFileDir = '/xxx';
- // 解压的配置参数。
- private options: zlib.Options = {
- // 压缩率 默认压缩等级。
- level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION
- };
- aboutToAppear(): void {
- // 准备zip到沙箱路径下
- this.copyRawFileToLocal();
- // 填充待解压文件路径和解压后的文件路径
- this.setting();
- }
- private setting(){
- let pathDir: string = getContext().filesDir;
- console.info(this.TAG, "setting pathDir: " + pathDir);
- this.inFile = pathDir + '/test.zip';
- console.info(this.TAG, "setting inFile: " + this.inFile);
- this.outFileDir = pathDir;
- console.info(this.TAG, "setting outFileDir: " + this.outFileDir);
- }
- /**
- * 点击解压
- */
- onUnZip = async ()=>{
- try {
- console.info(this.TAG, "onUnZip start");
- // 解压文件,解压的结果回调
- zlib.decompressFile(this.inFile, this.outFileDir, this.options, (errData: BusinessError) => {
- if (errData !== null) {
- console.error(this.TAG, `errData is errCode:${errData.code} message:${errData.message}`);
- }
- console.info(this.TAG, "onUnZip done");
- // 解压成功后,则去输出的路径下outFileDir,读取文件
- let fileTarget = fs.openSync(this.outFileDir + "/test.txt", fs.OpenMode.READ_ONLY);
- let size = fs.statSync(fileTarget.fd).size;
- console.info(this.TAG, "onUnZip size: " + size);
- let bufferRes = new ArrayBuffer(size);
- let readLen = fs.readSync(fileTarget.fd, bufferRes);
- fs.closeSync(fileTarget);
- console.info(this.TAG, "onUnZip readLen: " + readLen);
- let decoder = util.TextDecoder.create('utf-8');
- let temp = new Uint8Array(bufferRes);
- let result = decoder.decodeToString(temp);
- console.info(this.TAG, "onUnZip text: " + result);
- this.mZipTestContent = result;
- // let pathDir: string = getContext().filesDir;
- // let filePath = pathDir + "/test.txt";
- // let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
- // let arrayBuffer = new ArrayBuffer(4096);
- // fs.read(file.fd, arrayBuffer, (err: BusinessError, readLen: number) => {
- // if (err) {
- // console.error(this.TAG,"read failed with error message: " + err.message + ", error code: " + err.code);
- // } else {
- // console.info(this.TAG, "read file data succeed");
- // let buf = buffer.from(arrayBuffer, 0, readLen);
- // console.info(this.TAG, `The content of file: ${buf.toString()}`);
- // }
- // fs.closeSync(file);
- // });
- })
- } catch (errData) {
- let code = (errData as BusinessError).code;
- let message = (errData as BusinessError).message;
- console.error(this.TAG, `errData is errCode:${code} message:${message}`);
- }
- }
- private copyRawFileToLocal() {
- 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/files
- console.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);
- console.info(this.TAG, "file done");
- let writeLen = fs.writeSync(fileTarget.fd, val.buffer as ArrayBuffer);
- console.info(this.TAG, "write data to file succeed and size is:" + writeLen);
- fs.closeSync(fileTarget);
- } 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("点击解压,内容: " + this.mZipTestContent)
- .id('ZipTestPageHelloWorld')
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- .alignRules({
- center: { anchor: '__container__', align: VerticalAlign.Center },
- middle: { anchor: '__container__', align: HorizontalAlign.Center }
- })
- .onClick(this.onUnZip)
- }
- .height('100%')
- .width('100%')
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |