7
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 中提取单个文件。

提前致谢。

4

3 回答 3

15

对于任何对答案感兴趣的人,都可以使用流和模块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);
于 2015-10-02T22:09:22.823 回答
0

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

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

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);
于 2021-06-09T18:56:05.757 回答
0

这个简单的片段对我有用,并解压缩zipped.tgzdownloaded.json

const fs = require('fs');
const zlib = require('zlib');

const os = fs.createWriteStream('downloaded.json');
fs.createReadStream('zipped.tgz')
        .pipe(zlib.createGunzip())
        .pipe(os);
于 2021-12-14T09:30:56.937 回答