我正在尝试在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!
});
答案 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!')
});