2015-08-05 7 views
6

Próbuję wyodrębnić plik .tar (spakowany z katalogu), a następnie sprawdzić nazwy plików w wyodrębnionym katalogu. Używam tar-fs do wyodrębnienia pliku tar, a następnie użyj fs.createReadStream do manipulowania danymi. Oto, co mam do tej pory:System plików węzła js: zdarzenie końcowe nie jest wywoływane dla czytelnego strumienia

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

Miałem nadzieję na wyodrębnienie całego folderu, a następnie sprawdź nazwy plików. Cóż, jeszcze nie dotarłem tak daleko ...

Według mojego zrozumienia, dostałem czytelny strumień po rurze. Czy czytelny strumień ma wydarzenie końcowe? Moje pytanie brzmi, dlaczego zdarzenie end w kodzie nie jest wywoływane?

Dzięki!

Odpowiedz

12

Wysłuchaj zdarzenia finish dla zapisywalnych strumieni. Ta funkcja jest wywoływana po wywołaniu end() i zakończeniu przetwarzania wpisu. Więcej na ten temat here.

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

Witam @hassansin Dziękuję za wskazówki! Jeszcze jedno pytanie: Zdarzenia końcowe i końcowe pochodzą odpowiednio z zapisanych i zapisanych przez rodziców klas Macierzystych. Pierwsze zdanie mówi "koniec" dla Zapisywalnego i koniec dla Czytelnego, prawda? 'Zdarzenie finish jest wywoływane po wywołaniu funkcji .end() i wszystkie porcje zostały przetworzone przez _transform, koniec jest wywołany po wywołaniu wszystkich danych, które są po wywołaniu oddzwonienia w _flush. Zostanie wywołane po zakończeniu jeśli należą do różnych rzeczy? To jest mylące dla nowicjusza. Dzięki. – odieatla

+1

'finish' jest związane z' tar.extract() ', które jest zapisywalnym strumieniem. Ten zapisywalny strumień wewnętrznie utrzymuje kilka wejść 'stream's opartych na nie. plików w tar. Kiedy wszystkie pliki wejściowe są zapisywane na dysku, a dla nich jest emitowane słowo "koniec", program piszący ostatecznie wysyła polecenie "zakończ". – hassansin

+0

OK Myślę, że mogę to zdobyć ... Czyli 'finish' jest emitowany po tym, jak wszystkie" końce "strumienia są emitowane? – odieatla

Powiązane problemy