【问题标题】:How to extract .tar.bz2 in node.js using streams?如何使用流在 node.js 中提取 .tar.bz2?
【发布时间】:2013-07-18 21:21:57
【问题描述】:

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

我的文件每个约为 25mb,所以我认为最好的方法是使用 tar 模块的管道流(类似于您使用来自 node.js 的内置 ZLib 库的 Gunzip 用于 .tar.gz) .这样我也可以使用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!
});

【问题讨论】:

  • 但是您是否尝试过使用 node-gzbz2?有没有编译错误?,node-gyp 正是为了让 c/c++ 库在 node 工作的每个平台上工作。
  • 虽然这在技术上是正确的,但就像我在 OP 中所说的那样:实际上 node-gyp 不适用于许多 Windows 用户,因为它需要 Visual Studio 和其他像 python 这样的东西,许多普通用户不需要已安装。在我的情况下,这是一个表演停止者。
  • 很公平,Windows 上的本地库编译仍然是一团糟。我认为目前最好的解决方案是为 windows 提供预编译的程序集,但大多数 lib mantainers 不这样做。
  • 确实,虽然有npmjs.org/package/node-pre-gyp,但是很多node开发者并不关心windows。

标签: javascript node.js stream tar bzip2


【解决方案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!')
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2013-06-10
    • 2019-04-21
    • 2014-12-17
    • 2020-06-18
    • 2018-08-26
    • 2015-11-09
    • 2016-05-31
    相关资源
    最近更新 更多