【问题标题】:Node.js : Specify files to unzip with zlib + tarNode.js : 使用 zlib + tar 指定要解压的文件
【发布时间】:2014-02-24 13:39:17
【问题描述】:

安装过程正在下载.tar.gz 存档,然后将文件解压缩到目标目录。但是,并非存档中的所有文件都是必需的,我想指定应该提取哪些文件。天真的方法是在提取后删除不必要的文件,但我想要一种“更清洁”的方法并过滤掉。

这可能吗?

到目前为止,我所拥有的(相关)代码是(为了便于阅读而剥离)

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

var log = console.log;

var tarball = 'path/to/downloaded/archive.tar.gz';
var dest = 'path/to/destination';

fs.createReadStream(tarball)
  .on("error", log)
  .pipe(zlib.Unzip())
  .pipe(tar.Extract({ path: dest }))
  .on("end", log);

谢谢。

【问题讨论】:

    标签: node.js zlib


    【解决方案1】:

    它的工作方式类似于unzip 模块:

    var fs = require('fs');
    var tar = require('tar');
    var zlib = require('zlib');
    var path = require('path');
    var mkdirp = require('mkdirp'); // used to create directory tree
    
    var log = console.log;
    
    var tarball = 'path/to/downloaded/archive.tar.gz';
    var dest    = 'path/to/destination';
    
    fs.createReadStream(tarball)
      .on('error', log)
      .pipe(zlib.Unzip())
      .pipe(tar.Parse())
      .on('entry', function(entry) {
        if (/\.js$/.test(entry.path)) { // only extract JS files, for instance
          var isDir     = 'Directory' === entry.type;
          var fullpath  = path.join(dest, entry.path);
          var directory = isDir ? fullpath : path.dirname(fullpath);
    
          mkdirp(directory, function(err) {
            if (err) throw err;
            if (! isDir) { // should really make this an `if (isFile)` check...
              entry.pipe(fs.createWriteStream(fullpath));
            }
          });
        }
      });
    

    【讨论】:

    • @rynop 很好,虽然我会在调用 mkdirp() 之前执行该检查。
    • 哈哈哈哈哈。固定的。我还看到 .tar.gz 中的文件在提取后在磁盘上损坏。你以前见过这个吗?文件以正确的名称和结构进入磁盘,但文件内的 jar 已损坏。省略仅提取 JS 文件行并使用 tar.Extract() 这不会发生
    • @rynop 我使用过类似的代码来提取 tar 文件,它一直对我有用。如果你有一个示例 tar 文件给我,我很乐意看看。
    • @robertklep 我很感激:dynamodb-local.s3-website-us-west-2.amazonaws.com/… 你可以看到我在github.com/doapp-ryanp/dynamodb-local/blob/master/index.js#L105 工作的代码 - 如果我更改为tar.Parse() 并使用你的逻辑二进制文件会损坏(不同大小)
    • @rynop 这对我来说似乎工作得很好:gist.github.com/robertklep/01dd2c64a0fe9f5483d5(请随意将 cmets 留在那里而不是这里 :-)
    【解决方案2】:

    您可以查看this post 找到一个好的解决方案。

    顺便说一句,在zlib-documentation 中,您会看到您可以指定一个调用 .unzip() 的“缓冲区”。

    【讨论】:

    • 不,存档可能非常大,我不想分配那么多 RAM。内存占用必须是最小的。此外,档案包含目录结构,您提出的内容不适用。
    • 我必须从 tar 中读取提取的文件。我应该什么时候调用我的读取函数?我试过 onClose 但我的文件直到那时还没有完全写入。你可以看到我的代码。
    • fs.createReadStream(filename) .pipe(zlib.Unzip()) .pipe(new tar.Parse()) .on('entry', function(entry) { { var isDir = '目录' === entry.type; var fullpath = path.join(dest, entry.path); var directory = isDir ? fullpath : path.dirname(fullpath); mkdirp(directory, function(err) { if (err) throw err; if (!isDir) { entry.pipe(fs.createWriteStream(fullpath) .on('error', function(e){alert('Error');}) ); }});} })。 on('close', function(){setTimeout(readXMLFile(sysObject.path + '\\layout_new.xml'),0);})
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多