【问题标题】:How to extract single file from tar.gz archive using node js如何使用节点 js 从 tar.gz 存档中提取单个文件
【发布时间】:2013-11-27 12:15:13
【问题描述】:
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 中提取单个文件。

提前致谢。

【问题讨论】:

  • source for node-tar.gz 中您似乎没有该选项。查看从第 68 行开始的代码,了解 .extract 发生了什么。

标签: node.js archive extraction


【解决方案1】:

这个简单的 sn-p 对我有用,并将 zipped.tgz 解压缩为 downloaded.json

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

const os = fs.createWriteStream('downloaded.json');
fs.createReadStream('zipped.tgz')
        .pipe(zlib.createGunzip())
        .pipe(os);

【讨论】:

    【解决方案2】:

    这是旧的,但 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);
    

    【讨论】:

      【解决方案3】:

      对于任何对答案感兴趣的人,都可以使用流和模块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);
      

      【讨论】:

      • 在读取之前检查条目是否为文件:header.type === 'file'
      • 您可以跳过阅读不需要的文件。在entry 回调的开头键入:if (header.name !== 'document.json') { stream.resume(); sb() } 并从data 回调中删除名称检查。
      • 应该处理文件读取错误。在stream.resume()之前添加这个:stream.on('error', cb)
      猜你喜欢
      • 2015-09-06
      • 1970-01-01
      • 2017-07-26
      • 2011-03-29
      • 2021-06-02
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多