2015-08-05 10 views
6

Sto cercando di estrarre un file .tar (compresso da una directory) e quindi controllare i nomi dei file nella directory estratta. Sto usando tar-fs per estrarre il file tar e quindi utilizzare fs.createReadStream per manipolare i dati. Ecco cosa ho ottenuto finora:File system nodo js: evento finale non chiamato per flusso leggibile

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

Speravo di estrarre l'intera cartella e quindi controllare i nomi dei file. Beh, non sono ancora arrivato così lontano.

A quanto mi risulta, ho ottenuto un flusso leggibile dopo la pipa. E un flusso leggibile ha un evento finale? La mia domanda è: perché l'evento end nel codice non viene chiamato?

Grazie!

risposta

12

Ascolta per evento finish per flussi scrivibili. Questo viene attivato quando è stato chiamato end() e l'elaborazione della voce è terminata. Altro su di esso here.

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

Ciao @hassansin Grazie per la direzione! Ancora una domanda, 'Gli eventi di fine e fine sono rispettivamente delle classi genitore scrivibile e leggibile. La prima frase sta dicendo finitura per Writable e finisce per Leggibile, giusto? 'L'evento di fine viene attivato dopo che viene chiamato .end() e tutti i chunk sono stati elaborati da _transform, la fine viene attivata dopo che tutti i dati sono stati emessi dopo che è stato richiamato il callback in _flush. Quindi perché viene terminato il finale dopo la fine se appartengono a cose diverse? È confuso per un novellino come ... Grazie mille, – odieatla

+1

'finish' è associato a' tar.extract() 'che è un flusso scrivibile. Questo flusso scrivibile mantiene internamente diversi 'stream's di entrata basati sul no. di file nel tar. Quindi, quando tutti i file di voce sono scritti su disco e per loro viene emesso 'end', lo scrittore emette finalmente 'finish'. – hassansin

+0

OK Penso che potrei ottenerlo .. Quindi 'finish' viene emesso dopo che tutti gli 'end' del flusso sono stati emessi? – odieatla