2015-08-05 14 views
6

Ich versuche, eine .tar-Datei zu extrahieren (gepackt aus einem Verzeichnis) und überprüfen Sie dann die Namen der Dateien im extrahierten Verzeichnis. Ich benutze tar-fs, um die TAR-Datei zu extrahieren und dann fs.createReadStream zu verwenden, um die Daten zu manipulieren. Hier ist, was ich bisher habe:Knoten js Dateisystem: Ende Ereignis nicht für lesbaren Stream

fs.createReadStream(req.files.file.path) 
    .pipe(tar.extract(req.files.file.path + '0')) 
    .on('error', function() { 
    errorMessage = 'Failed to extract file. Please make sure to upload a tar file.'; 
    }) 
    .on('entry', function(header, stream, callback) { 
    console.error(header); 
    stream.on('end', function() { 
     console.error("this is working"); 
    }); 
    }) 
    .on('end', function() { 
    //the one did not get called 
    console.error('end'); 
    }) 
; 

Ich hatte gehofft, den gesamten Ordner zu extrahieren und dann die Dateinamen überprüfen. Naja, soweit bin ich noch nicht soweit ..

Zu meinem Verständnis habe ich nach der Pipe einen lesbaren Stream bekommen. Und ein lesbarer Stream hat ein Endereignis? Meine Frage ist, warum das end Ereignis im Code nicht aufgerufen wird?

Danke!

Antwort

12

Listen Sie nach finish Ereignis für beschreibbare Streams. Dies wird ausgelöst, wenn end() aufgerufen wurde und die Verarbeitung des Eintrags beendet ist. Mehr dazu here.

.on('finish', function() { 
    console.error('end'); 
}) 
+0

Hallo @hassansin Danke für die Richtung! Eine weitere Frage: "Das Ende und Ende Ereignisse sind von den Eltern Writable und Lesbare Klassen jeweils. Der erste Satz sagt Ende für Schreibbar und Ende für lesbar, nicht wahr? 'Das Ende-Ereignis wird ausgelöst, nachdem .end() aufgerufen wurde und alle Blöcke von _transform verarbeitet wurden. Ende wird ausgelöst, nachdem alle Daten ausgegeben wurden, die nach dem Rückruf in _flush aufgerufen wurden wenn sie zu verschiedenen Dingen gehören? Es ist verwirrend für einen Anfänger wie .. Vielen Dank, – odieatla

+1

'Finish' ist mit' tar.extract() 'verbunden, die ein beschreibbarer Stream ist. Dieser beschreibbare Stream verwaltet intern mehrere Eintrags-Streams basierend auf der Nummer. von Dateien im Teer. Wenn also alle Eintragsdateien auf die Platte geschrieben sind und für sie "end" ausgegeben wird, gibt der Schreiber schließlich "finish" aus. – hassansin

+0

OK Ich denke, ich kann es bekommen .. Also wird 'Finish' ausgegeben, nachdem alle" Enden "des Streams ausgesendet wurden? – odieatla