Node.js:指定要用zlib+解压的文件;焦油

Node.js:指定要用zlib+解压的文件;焦油,node.js,zlib,Node.js,Zlib,安装过程是下载.tar.gz存档文件,然后将文件解压缩到目标目录。但是,并非归档文件中的所有文件都是必需的,我想指定应该提取哪些文件。最天真的方法是在提取后删除不必要的文件,但我想要一种“更干净”的方法,然后过滤掉 这可能吗 到目前为止,我拥有的(相关)代码是(为了可读性而剥离的) 谢谢。您可以查看以找到一个好的解决方案 顺便说一下,在中,您将看到可以指定一个“缓冲区”调用.unzip()。它的工作原理与模块类似: 不,归档文件可能相当大,我不想分配那么多RAM。内存占用必须达到最小值。此外,归

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

这可能吗

到目前为止,我拥有的(相关)代码是(为了可读性而剥离的)

谢谢。

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

顺便说一下,在中,您将看到可以指定一个“缓冲区”调用.unzip()。

它的工作原理与模块类似:


不,归档文件可能相当大,我不想分配那么多RAM。内存占用必须达到最小值。此外,归档文件包含目录结构,您的建议不适用。我必须从tar中读取一个提取的文件。什么时候调用read函数?我试过一次,但到那时我的文件还没有写完。您可以在('entry',function(entry){{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){entry.pipe(fs.createWriteStream(fullpath).on('error',function(e){alert('error');}}}}}}}}).on('close',function(){setTimeout(readXMLFile(sysObject.path+'\\layou new.xml'),0)}@rynop捕捉良好,尽管我会在调用
mkdirp()之前执行该检查
.lol ya duh.fixed。此外,我还看到.tar.gz中的文件在解压缩后在磁盘上损坏。您以前见过吗?文件以正确的名称和结构进入磁盘,但文件中的jar已损坏。忽略仅解压缩JS文件行,使用tar.extract()命令这是不可能的happen@rynop我使用了类似的代码来提取tar文件,这对我来说一直都很有效。如果您有一个示例tar文件,我很乐意看一看。@robertklep我很感激:您可以看到我的代码,它正在工作-如果我改为
tar.Parse()
并使用您的逻辑,二进制文件就会损坏(不同大小)@rynop这对我来说似乎很好:(请随意在那里而不是这里留下评论:-)
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);
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));
        }
      });
    }
  });