【问题标题】:How to untar file in node.js如何在 node.js 中解压文件
【发布时间】:2012-11-21 08:28:54
【问题描述】:

有一些 untar 库,但我无法让它们工作。

我的想法是这样的

untar(bufferStreamOrFilePath).extractToDirectory("/path", function(err){})

有这样的东西吗?

【问题讨论】:

  • require('child_process').exec('tar -xf /path', function(err) {});
  • 当然可以,但我显然希望在不产生另一个进程的情况下这样做。
  • 在事件循环中执行 CPU 密集型任务并不是 node 的设计目的,而是 tar 的设计目的。
  • 因为它是我们构建工具的一部分,所以我不关心停止循环。 OTOH,我希望它能够在非 unix 环境中工作(阅读:win 用户)。

标签: node.js tar


【解决方案1】:

在内存中完全提取 base64 编码的 tar 的函数,假设 tar 中的所有文件都是 utf-8 编码的文本文件。

const tar=require('tar');
let Duplex = require('stream').Duplex;

function bufferToStream(buffer) {
    let stream = new Duplex();
    stream.push(buffer);
    stream.push(null);
    return stream;
}


module.exports=function(base64EncodedTar){
    return new Promise(function(resolve, reject){
        const buffer = new Buffer.from(base64EncodedTar, "base64");

        let files={};

        try{

            bufferToStream(buffer).pipe(new tar.Parse())
                .on('entry', entry => {
                    let file={
                        path:entry.path,
                        content:""
                    };
                    files[entry.path]=file;
                    entry.on('data', function (tarFileData) {
                        file.content += tarFileData.toString('utf-8');
                    });

                    // resolve(entry);
                }).on('close', function(){
                  resolve(files);
                });
        } catch(e){
            reject(e);
        }

    })

};

【讨论】:

  • 终于!经过很长很长时间和许多尝试和包装,我发现了这个评论!
【解决方案2】:

只是对这个答案的更新,而不是node-tar,考虑使用tar-fs,它可以显着提升性能,并且界面更简洁。

var tarFile = 'my-other-tarball.tar';
var target = './my-other-directory';

// extracting a directory
fs.createReadStream(tarFile).pipe(tar.extract(target));

【讨论】:

    【解决方案3】:

    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
      • 2013-03-09
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2010-10-16
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多