如何使用节点js从tar.gz存档中提取单个文件

时间:2013-11-14 13:08:14

标签: node.js archive extraction

var targz = require('tar.gz');
var extract = new targz().extract(targzFile , destnDir, function(err){
if(err)
     console.log(err);
console.log('The extraction has ended :'+counter);
});

上面的代码将targzFile提取到destnDir,但是我想从targzFile中提取单个文件。

提前致谢。

2 个答案:

答案 0 :(得分:4)

对于对答案感兴趣的人,可以使用流和模块tar-stream。这是一个完整的示例,它从存档 archive.tar.gz 中提取名为 documents.json 的文件:

var tar = require('tar-stream');
var fs = require('fs');
var zlib = require('zlib');

var extract = tar.extract();
var data = '';

extract.on('entry', function(header, stream, cb) {
    stream.on('data', function(chunk) {
    if (header.name == 'documents.json')
        data += chunk;
    });

    stream.on('end', function() {
        cb();
    });

    stream.resume();
});

extract.on('finish', function() {
    fs.writeFile('documents.json', data);
});

fs.createReadStream('archive.tar.gz')
    .pipe(zlib.createGunzip())
    .pipe(extract);

答案 1 :(得分:0)

这很旧,但 Gianni 的解决方案对我来说不太适用,也许是因为他正在提取文本文件,我不确定。

此外,您可以通过仅检查一次标题名称而不是检查每个文件记录的每个数据块来进行大量优化。

var tar = require('tar-stream');
var fs = require('fs');
var zlib = require('zlib');

var extract = tar.extract();
var chunks = [];

extract.on('entry', function(header, stream, next) {
    if (header.name == 'documents.bin') {
        stream.on('data', function(chunk) {
            chunks.push(chunk);
        });
    }

    stream.on('end', function() {
        next();
    });

    stream.resume();
});

extract.on('finish', function() {
    if (chunks.length) {
        var data = Buffer.concat(chunks);
        fs.writeFile('documents.bin', data);
    }
});

fs.createReadStream('archive.tar.gz')
    .pipe(zlib.createGunzip())
    .pipe(extract);