2

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

我的文件每个约为 25mb,所以我认为最好的方法是在带有tar模块的管道流中(类似于你如何使用来自 node.js 的内置 ZLib 库的 Gunzip 用于 .tar.gz)。这样我也可以使用request.

我找到了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!
});
4

1 回答 1

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!')
});
于 2014-09-01T01:00:59.877 回答