2016-06-17 11 views
0

ストリーミングを使用して小さなファイルを1つのファイルにマージしようとしています。 データを書き込んだ後、streamWrite.end()を呼び出しても、ファイルサイズは0のままです。プログラムの実行が終了すると、ファイルには書き込まれたデータが書き込まれます。Nodejsストリームは終了後にファイルを更新しません

私の質問: 私はwriteStream.end()とそれを解決する方法の後にファイルサイズが0だったのはなぜですか?ここで

問題はend()が非同期であることで、全体のコード

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

このソリューションには、コードの最後の3行を変更する必要があります。 http://stackoverflow.com/questions/18932488/how-can-i-use-the-drain-event -with-createwritestream-method-in-node-js –

答えて

1

です。これをテストするために使用した次のコードを考えてみましょう。

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

これは、初めて何も印刷しませんが、もう一度helloを印刷します。あなたは助けにはならなかった

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

ありがとう、それは私のために働いた。 –

関連する問題