如何使用流在node.js中提取.tar.bz2?

时间:2013-07-18 21:21:58

标签: javascript node.js stream tar bzip2

我正在尝试在node.js中提取一些.tar.bz2文件。我在这里搜索,在npm,github和谷歌谷歌,但没有现成的解决方案。

我的文件大约是25mb,所以我认为最好的方法是使用tar模块的管道流(类似于你如何使用来自node.js的内置ZLib库的.z的Gunzip。 GZ)。这样我也可以使用request直接从管道http中提取。

我找到了https://github.com/Woodya/node-gzbz2(并且它有许多重命名的分叉,如gzbz),但它们需要使用node-gyp构建外部依赖项。我不想使用这些,因为我正在构建的模块必须在linux,mac和windows上使用npm并且不依赖于像python这样的外部库而无需麻烦。

或者我看https://github.com/cscott/seek-bzip(和它的来源),我喜欢它是纯粹的javascript,但它只解码Buffers。

有人可以建议我去这里吗?

编辑: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!
});

1 个答案:

答案 0 :(得分: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!')
});