欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js?應(yīng)用探索文件解壓縮示例詳解

 更新時間:2022年09月06日 14:31:25   作者:小黃鴨來了  
這篇文章主要為大家介紹了Node.js?應(yīng)用探索文件解壓縮示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

今天在使用 node 腳本對文件處理時,需要實現(xiàn)一個功能,要對一個 zip 壓縮包解壓出來,修改里面的文件后,重新打包成zip包。node 解壓縮文件的場景在實際應(yīng)用中還是比較常見,下面介紹幾個用來解壓縮文件的庫和使用方法。

compressing

compressing 是一個使用起來方便、功能非常強(qiáng)大的node庫,它可以對文件、文件夾進(jìn)行解壓或壓縮,支持tar、gzip、tgz、zip等多種格式。

簡單安裝之后 npm install compressing,以 zip 壓縮包為例

解壓

解壓比較簡單,tar、gzip、zip 都是同個 API

const compressing = require('compressing');
// 將壓縮包解壓到 test 文件夾中
compressing.zip.uncompress('./test.zip','./test').then(() => {
	console.log('解壓完成')
}).catch(() => {
	console.log('解壓失敗')
})
// 將壓縮包解壓到當(dāng)前文件夾中
compressing.zip.uncompress('./test.zip','./')

壓縮

const compressing = require('compressing');
// 壓縮一個文件
compressing.zip.compressFile('E:/1.txt','E:/1.zip').then(() => {
	console.log('壓縮完成')
}).catch(() => {
	console.log('壓縮失敗')
})
// 壓縮一個文件夾
compressing.zip.compressDir('E:/test', 'E:/test.zip').then(func1).catch(func2);
// 同時壓縮多個文件和文件夾,采用 stream 的方式
const zipStream = new compressing.zip.Stream();
zipStream.addEntry('./test');
zipStream.addEntry('./1.txt');
zipStream.pipe(fs.createWriteStream('./test1.zip')).on('finish', ()=>{
	console.log('壓縮完成')
}).on('error', ()=>{
	console.log('壓縮失敗')
})

在使用compressing.zip.compressDir壓縮整個文件夾的時候,會把最外層的文件夾也一起壓縮,解壓出來又是一個完整的文件夾。但是我的需求時只想把這個文件夾下的所有文件打包,直接解壓出來得到零散的很多個文件。

最初的想法呢是通過 fs的API對文件夾進(jìn)行遍歷,用 addEntry 的方式打包,后來發(fā)現(xiàn)原來是可以設(shè)置參數(shù)的,只是文檔中沒有表現(xiàn)出來,而且寫著:usually you don't need it ,導(dǎo)致我走了很多彎路。

后面在 addEntry 的接口文檔中看到了有個 opt.ignoreBase 的參數(shù),才想到 compressDir 是不是也可以用。于是嘗試了一下,的確滿足了我的需求,含淚刪掉遍歷文件夾的代碼。

compressing.zip.compressDir('E:/test', 'E:/test.zip', {
	ignoreBase: true
})

基本上,一個解壓和壓縮的需求就可以完成了??善陀龅搅藗€問題,在用 compressing 壓縮成一個zip包之后,在某個特殊的系統(tǒng)中,用系統(tǒng)自帶的解壓出來,文件都變成文件夾了,比如 app.js 是個js文件,解壓后變成一個名為 app.js 的文件夾。這就很尷尬了。

我嘗試了compressDiraddEntry的方式,最終得到的結(jié)果都一樣。于是乎,為了驗證是這個系統(tǒng)本身解壓算法的問題,我又找了另外一個壓縮庫。

archiver

archiver是一個在nodejs中能跨平臺實現(xiàn)打包功能的模塊,通過 stream 的方式,可以打zip和tar包。如果連這個打包之后在這個系統(tǒng)中解壓出來的文件還是有問題的話,那我就可以認(rèn)為是這個系統(tǒng)的問題,而不是我代碼的問題。

const output = fs.createWriteStream('./test.zip');
const archive = archiver('zip', {zlib: {
	level: 9 // 設(shè)置壓縮等級
}});
archive.pipe(output);
archive.directory('./test', false); // 這里false參數(shù)和上面的ignoreBase為true效果一樣
archive.finalize();	// 完成壓縮
archive.on('end', () => {	// 壓縮結(jié)束時觸發(fā)
	console.log('壓縮完成');
});

本來想證明是這個系統(tǒng)本身存在問題,結(jié)果卻狠狠打臉了。用 archiver 壓縮后的 zip 包在這個系統(tǒng)中解壓出來是正常的文件,那么真相就是 compressing 的壓縮算法有點問題,只不過這個問題復(fù)現(xiàn)的場景很不一般,在正常的系統(tǒng)中都不會遇到。

不過呢,我想了又想,現(xiàn)在也只能算是一比一打平,為了科學(xué)的嚴(yán)謹(jǐn)性,我決定再找一個壓縮庫進(jìn)行驗證。

adm-zip

adm-zip 是一個支持zip壓縮和解壓縮的庫,而我也只需要壓縮zip格式包,剛好可以滿足我的需求。

壓縮

const admzip = new AdmZip();
// 壓縮文件夾
admzip.addLocalFolder('./test');
// 壓縮文件
admzip.addLocalFile('./1.txt');
admzip.writeZip('./test.zip');

addLocalFolder 壓縮整個文件夾的時候,會把這個文件夾下的所有文件打包,直接解壓出來得到零散的很多個文件,效果和compressDir設(shè)置參數(shù)ignoreBase為true一樣。

addLocalFolder 支持第二個參數(shù),可以將要壓縮的文件,壓縮進(jìn)壓縮包的某個路徑下。

admzip.addLocalFolder('./test','aaa');
admzip.addLocalFolder('./test','aaa/bbb');

可以設(shè)置多級目錄,解壓出來后的文件就在這個目錄里。

writeZip 是一個同步的方法,而上面兩個庫壓縮都是異步的。在使用 adm-zip 打包之后,驗證出來的效果和 archiver 是一樣的,在那個特殊的系統(tǒng)上,解壓都沒有問題。這就真的證明了 compressing 真的存在小問題,不過在正常場景中應(yīng)該都可以忽略不計。

解壓縮

adm-zip 也支持解壓縮。

const admzip = new AdmZip('./test.zip');
admzip.extractAllTo('./test'); // 把整個壓縮包完全解壓到 test 目錄中

除了解壓整個壓縮包,還支持單獨解壓某個文件

const admzip = new AdmZip('./test.zip');
const entry = zip.getEntry('1.txt');
admzip.extractEntryTo(entry, './test2', true, true);

extractEntryTo 支持4個參數(shù),第三個參數(shù)表示是否需要創(chuàng)建父文件夾,第四個參數(shù)表示是否要覆蓋。

總結(jié)

經(jīng)過多個庫的使用和對比,發(fā)現(xiàn) adm-zip 可以完美的解決我的需求,同時打包之后,體積也是最小的。在大部分的開發(fā)場景中,用哪個庫其實都不會有問題的。compressing 可以支持更多的壓縮格式,adm-zip只支持zip格式,archiver 卻不支持解壓縮,因此根據(jù)自己的應(yīng)用場景選擇最合適的庫吧。

以上就是Node.js 應(yīng)用探索文件解壓縮示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Node.js 文件解壓縮的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Node.js中的模塊系統(tǒng)介紹

    Node.js中的模塊系統(tǒng)介紹

    這篇文章介紹了Node.js中的模塊系統(tǒng),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Node.js Buffer模塊功能及常用方法實例分析

    Node.js Buffer模塊功能及常用方法實例分析

    這篇文章主要介紹了Node.js Buffer模塊功能及常用方法,結(jié)合實例形式分析了Buffer模塊的各種常用函數(shù)及相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • nodejs使用node-xlsx生成excel的方法示例

    nodejs使用node-xlsx生成excel的方法示例

    這篇文章主要介紹了nodejs使用node-xlsx生成excel,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Node.js 使用AngularJS的方法示例

    Node.js 使用AngularJS的方法示例

    這篇文章主要介紹了Node.js 使用AngularJS的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 使用pm2自動化部署node項目的方法步驟

    使用pm2自動化部署node項目的方法步驟

    這篇文章主要介紹了使用pm2自動化部署node項目的方法步驟,pm2是一個進(jìn)程管理工具,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • node.js中 mysql 增刪改查操作及async,await處理實例分析

    node.js中 mysql 增刪改查操作及async,await處理實例分析

    這篇文章主要介紹了node.js中 mysql 增刪改查操作及async,await處理,結(jié)合實例形式分析了node.js中 mysql庫安裝、增刪改查操作及async,await處理相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2020-02-02
  • Windows8下搭建Node.js開發(fā)環(huán)境教程

    Windows8下搭建Node.js開發(fā)環(huán)境教程

    這篇文章主要介紹了Windows8下搭建Node.js開發(fā)環(huán)境教程,Win8下安裝node.js也比較簡單,只是一些權(quán)限比較麻煩,需要的朋友可以參考下
    2014-09-09
  • node.js mongoose index索引操作

    node.js mongoose index索引操作

    在 Mongoose 中,索引(Index)是一種用于提高查詢性能的數(shù)據(jù)結(jié)構(gòu),它可以加速對數(shù)據(jù)庫中文檔的檢索操作,本文給大家介紹
    node.js mongoose index索引操作
    ,感興趣的朋友一起看看吧
    2023-12-12
  • node.js中的fs.lchownSync方法使用說明

    node.js中的fs.lchownSync方法使用說明

    這篇文章主要介紹了node.js中的fs.lchownSync方法使用說明,本文介紹了fs.lchownSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • npm 語義版本控制詳解

    npm 語義版本控制詳解

    這篇文章主要介紹了npm 語義版本控制詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評論