2013-03-20 306 views
16

我正在潛入Node.js的Zlib。我能夠使用提供的示例(http://nodejs.org/api/zlib.html#zlib_examples)壓縮和解壓縮文件,但是我無法找到更多關於對文件夾執行相同操作的內容嗎?Node.js - 壓縮/解壓縮文件夾

一種可能性(但我認爲是修補)是使用node-zip模塊並逐個添加文件夾的所有文件。但是當解壓時我會遇到問題(在這種情況下,我將丟失文件夾)。

任何想法如何使用Node.js壓縮(然後解壓縮)整個文件夾(尊重子焊接層次結構)?

謝謝。

+1

Zlib只是壓縮,你想tar一個文件夾然後壓縮它,整個tar.gz的東西,試試https://github.com/isaacs/node-tar – generalhenry 2013-03-20 17:29:15

+0

哦,我明白了!所以,我需要分兩步進行:1 /將文件夾轉換爲.tar文件,然後使用Zlib將.tar文件壓縮爲.tar.gz。 'node-tar'模塊沒有很好的文檔記錄,你有沒有額外的資源? – htaidirt 2013-03-20 17:42:12

+1

我看了一下,我發現的最好的是https://github.com/cthackers/adm-zip – generalhenry 2013-03-20 18:17:03

回答

25

我終於知道了,與@generalhenry的幫助(請參閱有關問題的評論)和

如在評論中提到的,我們需要在文件夾中的兩個步驟壓縮:

  1. 轉換的文件夾爲.tar文件

  2. 的壓縮文件.tar

爲了完成第一步,我需要兩個Node.js的模塊:

npm install tar 
npm install fstream 

第一個允許我們創建.tar文件。您可以在這裏訪問源代碼https://github.com/isaacs/node-tar

第二個節點模塊將幫助我們讀取文件夾並寫入文件。關於基本的fs node.js模塊,我不知道是否可以讀取一個目錄(我並不是說要使用fs.readdir來獲取數組中的所有文件,而是要處理文件夾中的所有文件及其組織)。

然後,當我將文件夾轉換爲.tar文件時,我可以使用Gzip()Zlib對其進行壓縮。

下面是最終代碼:

var fstream = require('fstream'), 
    tar = require('tar'), 
    zlib = require('zlib'); 

fstream.Reader({ 'path': 'path/to/my/dir/', 'type': 'Directory' }) /* Read the source directory */ 
.pipe(tar.Pack()) /* Convert the directory to a .tar file */ 
.pipe(zlib.Gzip()) /* Compress the .tar file */ 
.pipe(fstream.Writer({ 'path': 'compressed_folder.tar.gz' })); /* Give the output file name */ 

這幫助我瞭解如何使用Node.js

2更多的事情來壓縮整個文件夾:

  • 正如你所看到的,缺少有關tar模塊的文檔。我希望這將很快得到改善,因爲提供的兩個示例討論瞭如何從.tar文件中提取內容。

  • 我使用fstream模塊來幫助我處理源目錄。這可以繞過使用fs?我不知道(請評論你是否有想法)。

3

您可以使用tar-stream模塊創建一個tar歸檔文件。它更靈活,比節點焦油在簡單:

  • 您可以將文件添加到壓縮文件(不只是目錄,這是節點焦油的限制)
  • 它的工作原理與普通節點的文件系統流(節點焦油奇怪需要使用fstream的模塊)
  • 它相當完整的文檔(節點焦油是不是有據可查)
  • 你可以沒有擊中文件系統創建歸檔

創建柏油 歸檔,然後使用zlib壓縮,然後將其寫入任何地方(網絡,文件系統等)。

+0

你能提供關於tar-stream說/展示它可以使用節點文件系統('fs')流的文檔。我似乎無法找到任何。 – 2016-04-05 18:01:10

+0

在這一點上,我正在用這個模塊練習。也許這會有幫助? https://github.com/mafintosh/tar-stream/issues/8 – 2016-04-05 19:16:05