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

3
我正在尝试在node.js中提取一些.tar.bz2文件。我在npm、github和谷歌上搜索,但没有现成的解决方案。
我的文件每个约25mb,所以我认为最好的方法是使用“tar”模块中的管道流(类似于您如何使用来自node.js内置ZLib库的Gunzip进行.tar.gz)。这样,我还可以直接从管道http使用“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-fibers 又使用 node-gyp,在我的情况下这是不可取的。请参见https://github.com/cscott/seek-bzip/issues/1

编辑2:我仍在寻找跨平台解决方案,但这里有一种使用 CLI 命令快速解决的方法:

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

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

你尝试过使用node-gzbz2吗?有没有编译错误?node-gyp的目的是让C/C++库在Node可运行的每个平台上工作。 - Benja
虽然从技术上讲这是正确的,但正如我在原帖中所述:实际上,node-gyp 对许多 Windows 用户来说并不适用,因为它需要 Visual Studio 和其他一些像 Python 这样的东西,而许多普通用户没有安装。在我的情况下,这是一个无法克服的障碍。 - Bartvds
还算公平,Windows 上的本地库编译仍然很混乱。我认为目前最好的解决方案是为 Windows 提供预编译的程序集,但大多数库维护者都不这样做。 - Benja
实际上,虽然有 https://www.npmjs.org/package/node-pre-gyp,但许多 Node 开发人员并不关心 Windows。 - Bartvds
我个人总是使用@shockpkg/archive-files来完成这个任务。 - Stefnotch
1个回答

3

我觉得这个问题实际上有两个部分:如何解密bz2和如何解压tar。我会回答解压部分。 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!')
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接