2

node.js でいくつかの .tar.bz2 ファイルを抽出しようとしています。私はここで、npm、github、および google でこれを検索していますが、すぐに解決できる解決策はありません。

私のファイルはそれぞれ約 25 MB であるため、モジュールを使用してパイプ ストリームを使用するのが最善の方法だと思いtarます (.tar.gz 用の node.js の組み込み ZLib ライブラリから Gunzip を使用する方法と同様です)。このようにして、 を使用して、パイプされた http から直接抽出することもできますrequest

https://github.com/Woodya/node-gzbz2を見つけました (そして、 のように多くの名前が変更されたフォークですgzbz) が、node-gyp. 私が構築しているモジュールは、Python などの外部ライブラリに依存せずに、npm だけを使用して Linux、Mac、および Windows で問題なく動作する必要があるため、これらを使用したくありません。

または、https://github.com/cscott/seek-bzip (およびそのソース) を見て、それが純粋な JavaScript であるのが好きですが、バッファーのみをデコードします。

ここに行く道について誰かアドバイスしてくれませんか?

編集: の作成者はseek-bzip、同期ストリームを非同期ストリームに変換するラッパーを親切に作成しましたが、この修正は、私の場合は望ましくないものnode-fibersを再度使用するかどうかによって異なります。https://github.com/cscott/seek-bzip/issues/1node-gypを参照してください

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

この質問は本当に 2 つの質問だと思います。bz2 を復号化する方法と untar する方法です。アンタリングの部分にお答えします。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 に答える