91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Node.js實現文件解壓縮

發布時間:2022-09-07 09:53:28 來源:億速云 閱讀:3083 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么使用Node.js實現文件解壓縮”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用Node.js實現文件解壓縮”文章能幫助大家解決問題。

    compressing

    compressing 是一個使用起來方便、功能非常強大的node庫,它可以對文件、文件夾進行解壓或壓縮,支持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('解壓失敗')
    })
    // 將壓縮包解壓到當前文件夾中
    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對文件夾進行遍歷,用 addEntry 的方式打包,后來發現原來是可以設置參數的,只是文檔中沒有表現出來,而且寫著:usually you don't need it ,導致我走了很多彎路。

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

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

    基本上,一個解壓和壓縮的需求就可以完成了。可偏偏就遇到了個問題,在用 compressing 壓縮成一個zip包之后,在某個特殊的系統中,用系統自帶的解壓出來,文件都變成文件夾了,比如 app.js 是個js文件,解壓后變成一個名為 app.js 的文件夾。這就很尷尬了。

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

    archiver

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

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

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

    不過呢,我想了又想,現在也只能算是一比一打平,為了科學的嚴謹性,我決定再找一個壓縮庫進行驗證。

    adm-zip

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

    壓縮

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

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

    addLocalFolder 支持第二個參數,可以將要壓縮的文件,壓縮進壓縮包的某個路徑下。

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

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

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

    解壓縮

    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個參數,第三個參數表示是否需要創建父文件夾,第四個參數表示是否要覆蓋。

    關于“怎么使用Node.js實現文件解壓縮”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    德昌县| 江永县| 衡南县| 天峨县| 确山县| 潜山县| 东山县| 伊吾县| 金阳县| 孙吴县| 祁连县| 灵丘县| 吴川市| 定西市| 东乡县| 孝感市| 巴南区| 峨眉山市| 岫岩| 桦甸市| 平和县| 徐州市| 长沙市| 湖口县| 咸丰县| 满洲里市| 香河县| 三亚市| 肇东市| 陆川县| 泗阳县| 焉耆| 万安县| 呼和浩特市| 丹凤县| 丰都县| 辽阳县| 电白县| 永昌县| 博兴县| 渭源县|