首页 > 解决方案 > 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 for a image faster?因为我认为它挂了,因为我效率低下。我得到了一些关于直接从读取流写入的好答案,而不是打扰缓冲区(感谢@jfriend00 和@Randy Casburn):

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

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

标签: javascriptnode.jsfilestream

解决方案


推荐阅读