2014-02-24 4 views
8

Ein Installationsprozess lädt ein .tar.gz Archiv herunter und entpackt die Dateien in ein Zielverzeichnis. Allerdings sind nicht alle Dateien im Archiv erforderlich, und ich möchte angeben, welche Dateien extrahiert werden sollen. Der naive Weg wäre, die unnötigen Dateien nach der Extraktion zu löschen, aber ich möchte einen "saubereren" Weg und stattdessen herausfiltern.Node.js: Geben Sie die Dateien an, die mit zlib + tar entpackt werden sollen

Ist das möglich?

Der (relevante) Code, den ich habe, so weit (zur besseren Lesbarkeit gestrippt)

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); 

Danke.

Antwort

10

Es funktioniert ähnlich dem unzip Modul:

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)); 
     } 
     }); 
    } 
    }); 
+0

Funktioniert wie ein Charme! –

+0

Sie suchen nach Typ Directory. Ich habe die Antwort bearbeitet. – rynop

+0

@rynop guten Fang, obwohl ich diese Überprüfung vor dem Aufruf von 'mkdirp()' durchführen würde. – robertklep

0

Sie können einen Blick auf this post werfen, um eine gute Lösung zu finden.

Übrigens, in der zlib-documentation werden Sie sehen, dass Sie einen "Puffer" angeben können, der .unzip() aufruft.

+0

Nein, kann das Archiv ziemlich groß sein, und ich will nicht, dass viel RAM zuweisen. Der Speicherbedarf muss minimal sein. Außerdem enthält das Archiv eine Verzeichnisstruktur und das, was Sie vorschlagen, trifft nicht zu. –

+0

Ich muss eine extrahierte Datei aus dem Teer lesen. Wann soll ich meine Lesefunktion aufrufen? Ich habe onClose versucht, aber meine Datei ist bis dahin nicht vollständig geschrieben. Sie können meinen Code sehen. –

+0

fs.createReadStream (Dateiname) \t \t .pipe (zlib.Unzip()) \t \t .pipe (new tar.Parse()) \t \t .on ('Eintrag', function (Eintrag) \t \t \t { \t \t \t \t { \t \t \t \t \t var isDir = 'Verzeichnis' === entry.type; \t \t \t \t \t var fullpath = Pfad.join (dest, entry.path); \t \t \t \t \t var verzeichnis = isDir? vollständiger Pfad: Pfad.dirname (vollständiger Pfad); \t \t \t \t \t mkdirp (Verzeichnis-Funktion (err) { \t \t \t \t \t if (err) throw err; \t \t \t \t \t if (isDir) \t \t \t \t \t { \t \t \t! \t \t \t entry.pipe (fs.createWriteStream (vollständiger Pfad) \t \t \t \t \t \t.an ('Fehler', Funktion (e) {Alarm ('Fehler');}) ); \t \t \t \t \t}});} \t \t \t}) am ('Schließen', function() {SetTimeout (readXMLFile (sysObject.path + '\\ layout_new.xml'), 0);.}) –

Verwandte Themen