2016-06-17 10 views
0

Ich versuche, kleine Dateien mit Streaming in eine Datei zusammenzuführen. Nachdem ich die Daten schreiben und streamWrite.end() aufrufen, ist die Dateigröße immer noch 0. Wenn das Programm beendet ist, wird die Datei mit den Daten gefüllt, die ich geschrieben habe.Nodejs Stream aktualisiert die Datei nach dem Ende nicht

Meine Frage ist: warum die Dateigröße 0 war, nachdem ich writeStream.end() aufgerufen habe und wie man das löst?

Hier ist der gesamte Code

var fs = require('fs'); 

function createRandomJsonFiles(destPath,numOfFiles,minFileSize) 
{ 
    for(var i=0;i<numOfFiles;i++){ 
     var tmp = {}; 
     tmp.k1 = new Array(Math.floor(Math.random() * minFileSize) + minFileSize).join('a'); 
     fs.writeFileSync(destPath+'/testfile.'+i, JSON.stringify(tmp)); 
    } 
} 

createRandomJsonFiles("./testFiles/",1000,100); // create some files 

var streamWrite = fs.createWriteStream('write.tst'); 

var files = fs.readdirSync("./testFiles/"); 
for (var i = 0; i < files.length; ++i) { // merge the files to one file 
    var inputPath = "./testFiles/" + files[i]; 
    var file_data = fs.readFileSync(inputPath).toString(); 
    var canContinue = streamWrite.write(file_data); // write the chunk to the file system and close the stream 
    if (!canContinue){ 
     streamWrite.emit('drain'); 
    } 
} 
streamWrite.end(); 
var chunkContent = fs.readFileSync('write.tst').toString(); 
console.log(chunkContent); 
+0

Diese Lösung, um die letzten 3 Zeilen Code ändern nicht helfen: http://stackoverflow.com/questions/18932488/how-can-i-use-the-drain-event -mit-createwritestream-method-in-node-js –

Antwort

1

Das Problem ist, dass end() asynchron ist. Betrachten Sie den folgenden Code, mit dem ich das getestet habe.

var fs = require("fs"); 

var stream1 = fs.createWriteStream("a"); 
stream1.write("hello"); 
stream1.end(); 
console.log(fs.readFileSync("a").toString()); 

var stream2 = fs.createWriteStream("b"); 
stream2.write("hello"); 
stream2.end(function() { 
    console.log(fs.readFileSync("b").toString()); 
}); 

Das ist nichts das erste Mal gedruckt wird, aber hello das zweite Mal. Sie sollten

streamWrite.end(function() { 
    var chunkContent = fs.readFileSync('write.tst').toString(); 
    console.log(chunkContent); 
}); 
+0

Danke, es hat für mich funktioniert. –

Verwandte Themen