鴻蒙開發實戰案例:文件壓縮案例

介紹

本示例介紹在Worker子線程使用@ohos.zlib提供的zlib.compressfile接口對沙箱目錄中的文件進行壓縮操作,壓縮成功后將壓縮包所在路徑返回主線程,獲取壓縮文件列表。

效果圖預覽

使用說明

  1. 點擊壓縮按鈕,壓縮待壓縮文件,顯示壓縮結果。

下載安裝

  1. 模塊oh-package.json5文件中引入依賴
   "dependencies": {
     "@ohos/compressfile": "har包地址"
   }
  1. ets文件import自定義視圖實現文件壓縮效果組件
   import { CompressFileComponent } from '@ohos/compressfile';

快速使用

本節主要介紹了如何快速上手使用壓縮文件組件,包括構建壓縮組件以及常見自定義參數的初始化。

  1. 構建組件

在代碼合適的位置使用CompressFileComponent組件并傳入對應的參數,后續將介紹對應參數的初始化。

   /**
    * 構建壓縮組件
    * compressBundleName: 壓縮成功后壓縮包的名字
    * beCompressFileDir: 待壓縮文件所在目錄名
    * compressZipPath: 壓縮成功后壓縮包路徑
    */
   CompressFileComponent({
     compressBundleName: this.compressBundleName,
     beCompressFileDir: this.beCompressFileDir,
     compressZipPath: this.compressZipDir,
   })
  1. 各參數初始化,compressBundle可直接賦空,beCompressFileDir可直接賦值字符串,compressZipPath需指定路徑,格式為:目錄名/壓縮包名字。
   @State compressBundleName: string = ''; // 壓縮成功后壓縮包名字
   @State compressZipDir: string = 'bundlefile/compress_file.zip'; // 壓縮成功后壓縮包文件路徑
   @State beCompressFileDir: string = 'compressfile'; // 待壓縮文件所在目錄名

屬性(接口)說明

CompressFileComponent組件屬性

屬性 類型 釋義 默認值
compressBundle string 壓縮成功后壓縮包的名字 -
compressZipPath string 壓縮成功后壓縮包文件路徑 -
beCompressFileDir string 待壓縮文件在rawfile下和應用沙箱目錄下所在目錄名 -

實現思路

本示例通過主線程向子線程發送被壓縮文件目錄,壓縮文件名稱和沙箱路徑,在子線程中使用Zlib模塊提供的zlib.compressfile接口實現文件壓縮。

  1. 在/src/main/ets/worker目錄下創建Worker.ets線程文件,綁定Worker對象。
   const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  1. 在build-profile.json5中進行配置Worker線程文件路徑,Worker線程文件才能確保被打包到應用中。
   "buildOption": {
     "sourceOption": {
       "workers": [
         "./src/main/ets/workers/Worker.ets"
       ]
     }
   }
  1. 在主線程創建一個Worker線程,通過new worker.ThreadWorker()創建Worker實例,傳入Worker.ets的加載路徑。
   let workerInstance: worker.ThreadWorker = new worker.ThreadWorker('@compressfile/ets/worker/Worker.ets');
  1. 主線程使用postMessage()向Worker線程發送應用沙箱路徑,壓縮包路徑和被壓縮文件所在目錄。
   workerInstance.postMessage({
     pathDir: this.pathDir,
     compressZipPath: this.compressZipPath,
     beCompressFileDir: this.beCompressFileDir
   });
  1. 在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('/'));
   };
  1. 使用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                            // 日志打印工具類

寫在最后

  • 如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
  • 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
  • 關注小編,同時可以期待后續文章ing??,不定期分享原創知識。
  • 想要獲取更多完整鴻蒙最新學習知識點,請移步前往小編:https://gitee.com/MNxiaona/733GH/blob/master/jianshu
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容