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

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

【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%')

}

}

相关数据

华为手机扬声器、听筒声音小的解决方法
be365体育平台

华为手机扬声器、听筒声音小的解决方法

⌛ 08-04 👁️ 6626
美度黑贝入手作业
365体育欧洲版本

美度黑贝入手作业

⌛ 07-17 👁️ 5827