鸿蒙应用开发 文件压缩案例

往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)

1.嵌入式开发适不适合做鸿蒙南向开发?一文带你了解

2.鸿蒙众多岗位需求突增!该如何选择?

3.分享一场鸿蒙开发岗位面试经历~

4.待更新中……

介绍

本示例介绍在Worker子线程使用@ohos.zlib 提供的zlib.compressfile接口对沙箱目录中的文件进行压缩操作,压缩成功后将压缩包所在路径返回主线程,获取压缩文件列表。

效果图预览

使用说明

  1. 点击压缩按钮,压缩待压缩文件,显示压缩结果。

下载安装

  1. 模块oh-package.json5文件中引入依赖

    "dependencies": {
      "compressfile": "har包地址"
    }
    
  2. ets文件import自定义视图实现文件压缩效果组件

    import { CompressFileComponent } from 'compressfile';
    

快速使用

本节主要介绍了如何快速上手使用压缩文件组件,包括构建压缩组件以及常见自定义参数的初始化。

  1. 构建组件

    在代码合适的位置使用CompressFileComponent组件并传入对应的参数,后续将介绍对应参数的初始化。

    /**
     * 构建压缩组件
     * compressBundleName: 压缩成功后压缩包的名字
     * beCompressFileDir: 待压缩文件所在目录名
     * compressZipPath: 压缩成功后压缩包路径
     */
    CompressFileComponent({
      compressBundleName: this.compressBundleName,
      beCompressFileDir: this.beCompressFileDir,
      compressZipPath: this.compressZipDir,
    })
    
  2. 各参数初始化,compressBundle可直接赋空,beCompressFileDir可直接赋值字符串,compressZipPath需指定路径,格式为:目录名/压缩包名字。

    @State compressBundleName: string = ''; // 压缩成功后压缩包名字
    @State compressZipDir: string = 'bundlefile/compress_file.zip'; // 压缩成功后压缩包文件路径
    @State beCompressFileDir: string = 'compressfile'; // 待压缩文件所在目录名
    

属性(接口)说明

CompressFileComponent组件属性

属性类型释义默认值
compressBundlestring压缩成功后压缩包的名字-
compressZipPathstring压缩成功后压缩包文件路径-
beCompressFileDirstring待压缩文件在rawfile下和应用沙箱目录下所在目录名-

实现思路

本示例通过主线程向子线程发送被压缩文件目录,压缩文件名称和沙箱路径,在子线程中使用Zlib模块提供的zlib.compressfile接口实现文件压缩。

  1. 在/src/main/ets/worker目录下创建Worker.ets线程文件,绑定Worker对象。
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;

     2. 在build-profile.json5中进行配置Worker线程文件路径,Worker线程文件才能确保被打包到应用中。

"buildOption": {
  "sourceOption": {
    "workers": [
      "./src/main/ets/workers/Worker.ets"
    ]
  }
}

     3. 在主线程创建一个Worker线程,通过new worker.ThreadWorker()创建Worker实例,传入Worker.ets的加载路径。  

let workerInstance: worker.ThreadWorker = new worker.ThreadWorker('@compressfile/ets/worker/Worker.ets');

     4. 主线程使用postMessage()向Worker线程发送应用沙箱路径,压缩包路径和被压缩文件所在目录。

workerInstance.postMessage({
  pathDir: this.pathDir,
  compressZipPath: this.compressZipPath,
  beCompressFileDir: this.beCompressFileDir
});

    5. 在Worker.ets文件中通过调用onmessage()方法接收主线程发送的应用沙箱路径,压缩文件名称和压缩文件目录名称。  

workerPort.onmessage = (e: MessageEvents): void => {
  logger.info(TAG, `Worker onmessage:${JSON.stringify(e.data)}`);
  const pathDir: string = e.data.pathDir; // 沙箱目录
  const rawfileDirName: string = e.data.beCompressFileDir; // 被压缩文件所在目录名
  // TODO: 知识点: 压缩文件输出路径不能有特殊字符,否则会压缩失败
  // 压缩包输出路径
  const outFilePath: string = `${pathDir}/${e.data.compressZipPath}`;
  // 压缩包输出目录
  const outFileDir: string = outFilePath.slice(0, outFilePath.lastIndexOf('/'));
};

    6. 使用fs.access判断输出目录是否已经存在,如果不存在使用fs.mkdirSync()创建空目录用于放置压缩后的文件。空目录创建成功后使用zlib.compressFile接口压缩文件,输出到空目录中。

fs.access(outFileDir, (err: BusinessError, res: boolean) => {
  if (err) {
    logger.error(TAG, `access failed with error message: ${err.message}, error code: ${err.code}`)
  } else {
    if (!res) {
      fs.mkdirSync(outFileDir);
      logger.info(TAG, 'mkdirSync succeed');
    }
  }
});
let options: zlib.Options = {
  level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION,
  memLevel: zlib.MemLevel.MEM_LEVEL_DEFAULT,
  strategy: zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY
};
try {
  // 对目录下的文件进行压缩
  zlib.compressFile(`${pathDir}/${rawfileZipName}`, outFile, options, (errData: BusinessError) => {
    if (errData !== null) {
      logger.error(TAG, `compress failed with error message: ${errData.message}, error code: ${errData.code}`);
    } else {
      workerPort.postMessage(outFileDir);
    }
  })
} catch (errData) {
  let code = (errData as BusinessError).code;
  let message = (errData as BusinessError).message;
  logger.error(TAG, `compress errData is error code: ${code}, message: ${message}`);
}

高性能知识点

  1. 本示例使用在Work子线程中使用zlib.compressFile压缩文件,避免阻塞主线程的运行。参考文章多线程能力场景化示例实践。

工程结构&模块类型

compressFile                                  // har类型
|---/src/main/ets/components                        
|   |---CompressFile.ets                      // 文件压缩案例首页
|   |---CompressFileComponent.ets             // 文件压缩组件
|---/src/main/ets/worker                        
|   |---Worker.ets                            // Worker线程
|---/src/main/ets/utils
|   |---Logger.ets                            // 日志打印工具类

模块依赖

routermodule(动态路由)

参考资料

@ohos.worker(启动一个Worker)

@ohos.zlib(Zip模块)

@ohos.file.fs(文件管理)

最后:

如果还有不知道从哪里开始入手了解鸿蒙开发技术、想要更深的掌握鸿蒙开发技术知识点的朋友们,或者是转行求职人员还在为面试问题而犯难的,可以动动手指进来参考一下针对‌鸿蒙开发学习‌而设计的系统性学习方案,涵盖基础入门到进阶实战项目相关学习文档:【鸿蒙开发学习指南】

 这些内容是从初级>中级>高级的所有知识点,带你更快速了解基本编程逻辑,▶适合人群包括:零基础开发者、移动端转型者、物联网从业者、应届生/计算机专业。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值