Nodejs Stream不会在结束后更新文件

时间:2016-06-17 10:14:21

标签: node.js

我正在尝试使用流式传输将小文件合并到一个文件中。 在我写入数据并调用streamWrite.end()之后,文件大小仍为0.当程序运行完毕时,文件中填充了我写的数据。

我的问题是: 为什么在我调用writeStream.end()之后文件大小为0以及如何解决这个问题?

这是整个代码

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

1 个答案:

答案 0 :(得分:1)

问题是end()是异步的。请考虑以下用于测试此代码的代码。

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第二次打印。您应该将代码的最后3行更改为

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