2013-02-01 10 views
7

Mój problem polega na tym, że nie mogę być pewien, kiedy plik został pomyślnie zapisany, a plik został zamknięty. Rozważmy następujący przypadek:Jak poprawnie opróżnić plik Node.js writeStream?

var fs = require('fs'); 
var outs = fs.createWriteStream('/tmp/file.txt'); 
var ins = <some input stream> 

... 
ins.on('data', function(chunk) { out.write(chunk); }); 
... 
ins.on('end', function() { 
    outs.end(); 
    outs.destroySoon(); 
    fs.stat('/tmp/file.txt', function(err, info) { 

     // PROBLEM: Here info.size will not match the actual number of bytes. 
     // However if I wait for a few seconds and then call fs.stat the file has been flushed. 
    }); 
}); 

Jak wymusić lub w inny sposób upewnić się, że plik został poprawnie przepłukany przed uzyskaniem do niego dostępu? Muszę mieć pewność, że plik jest tam i kompletny, ponieważ mój kod musi odrodzić zewnętrzny proces, aby odczytać i przetworzyć plik.

Odpowiedz

7

Czy postprocessingu plik w przypadku writeable stream'sclose:

outs.on('close', function() { 
    <<spawn your process>> 
}); 

Ponadto, nie ma potrzeby, aby destroySoon po endone and the same.

+0

Dzięki, słuchanie wydawania "zamkniętego" wydarzenia wydaje się załatwiać. Nie wiedziałem, że destroySoon jest zbędny dla plików. –

+0

Świetnie. Cieszę się, że mogłem pomóc. –

+5

to w rzeczywistości nie działa dla nas. Nadal mamy pewne przypadki (na SmartOS/Mac i Windows, gdzie zamknięty jest sygnał ZANIM zawartość pliku została opróżniona) – mgoetzke

Powiązane problemy