2013-07-18 57 views
1

我試圖在node.js中提取一些.tar.bz2文件。我在這裏,在npm,github和谷歌搜索這個,但沒有現成的解決方案。如何使用流提取node.js中的.tar.bz2?

我的文件是25MB〜每個所以我認爲最好的辦法是與tar模塊傳送流(類似於你如何從內置的zlib庫確定爲.tar.gz的node.js的使用gunzip解)。這樣我也可以使用request直接從管道http中提取。

我發現https://github.com/Woodya/node-gzbz2(它有很多重命名爲gzbz的叉),但它們需要使用node-gyp構建的外部依賴關係。我不想使用這些,因爲我正在構建的模塊必須在linux,mac和windows上使用npm而不用麻煩,而不需要依賴像python這樣的外部庫。

另外我看https://github.com/cscott/seek-bzip(它的來源),我喜歡它是純粹的JavaScript,但它只解碼緩衝區。

任何人都可以在去這裏的路上指教我嗎?

編輯:的seek-bzip筆者好心創建的包裝把他的同步流成異步的,但此修復程序取決於node-fibers其再次使用node-gyp這在我的情況是不可取的。見https://github.com/cscott/seek-bzip/issues/1

EDIT2:我還在尋找一個跨平臺的解決方案,但這裏是一個快速的方法來做到這一點使用CLI命令:

var cmd = 'bunzip2 -c ' + sourceFile + ' | (cd ' + targetDir + '; tar -xf -)'; 

require('child_process').exec(cmd, function (err, stdout, stderr) { 
    if (err) { 
     // bad 
    } 
    // yea! 
}); 
+0

但你有沒有嘗試過使用node-gzbz2?有沒有編譯錯誤?,node-gyp恰恰是爲了使c/C++庫在節點工作的每個平臺上都能工作。 – Benja

+0

儘管這在技術上是正確的,但正如我在OP中說明的那樣:在實踐中,node-gyp不適用於許多Windows用戶,因爲它需要Visual Studio和其他類似Python的東西,許多常規用戶沒有安裝。在我的情況下,這是一個表演停止。 – Bartvds

+0

不夠公平,windows上的本地libs編譯仍然是一團糟。我認爲到目前爲止最好的解決方案是爲Windows提供預編譯程序集,但大多數lib mantainers不這樣做。 – Benja

回答

0

我覺得這個問題確實是2個問題:如何解密bz2以及如何解密。我會回答原始部分。 tar-stream模塊是一個不錯的:

var tar = require('tar-stream')  

var extract = tar.extract(); 
extract.on('entry', function(header, stream, callback) { 
    // make directories or files depending on the header here... 
    // call callback() when you're done with this entry 
}); 

fs.createReadStream("something.tar").pipe(extract) 

extract.on('finish', function() { 
    console.log('done!') 
});