fs writeFile在完成写入文件之前冻结

问题描述

我的代码立即针对600kB文件... 700kB文件运行,在800kB时突然挂起,直到最后。

每次打印块写入缓冲区时,我都会打印出来。 (65536是2 ^ 16,大概是每个块的大小。)

  var bufs = [];
  var count = 0;
  readStream.on('data',function(d){ bufs.push(d); 
    count += 65536;
    console.log(count/1000 + "k" + "/ 800k");
  });
  readStream.on('end',function(){
  var buf = Buffer.concat(bufs);
  console.log(buf);
  fs.writeFile("test.jpg",buf,()=>{console.log('hi')});
  });

我明白了:

5:04:02 PM web.1 |  65.536k/ 800k
5:04:02 PM web.1 |  131.072k/ 800k
5:04:02 PM web.1 |  196.608k/ 800k
5:04:02 PM web.1 |  262.144k/ 800k
5:04:02 PM web.1 |  327.68k/ 800k
5:04:02 PM web.1 |  393.216k/ 800k
5:04:02 PM web.1 |  458.752k/ 800k
5:04:02 PM web.1 |  524.288k/ 800k
5:04:02 PM web.1 |  589.824k/ 800k
5:04:02 PM web.1 |  655.36k/ 800k
5:04:02 PM web.1 |  720.896k/ 800k
5:04:02 PM web.1 |  786.432k/ 800k
5:04:02 PM web.1 |  851.968k/ 800k

这意味着到达终点,但是readStream.on('end'...没有触发。因此,实际的fs writeFile不会真正发生。

以前,我问了一个问题How to make fs writeFile faster for an image?,因为我认为它挂起是因为我做的效率低下。我直接从读取流中获得了一些很好的答案,而不必担心缓冲区(感谢@ jfriend00和@Randy Casburn):

readStream.pipe(fs.createWriteStream("test.jpg"));
readStream.on('end',() => {
    console.log("all done Now");
});

但它仍然挂起,完全相同,大小约为800kB。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)