如何递增写入文本文件并刷新输出

我的Node.js程序 – 这是一个普通的命令行程序,大体上不会做任何exception的操作,没有任何系统特定的或asynchronous的或类似的东西 – 需要不时写信息到文件,然后它会被^ C中断,它需要文件的内容仍然在那里。

我已经尝试使用fs.createWriteStream但只是结束了一个0字节的文件。 (如果程序通过运行主文件的末尾来结束程序,则该文件将包含文本,但这不是我的场景。)

我已经尝试使用winston但最终没有创build文件。 (如果程序通过运行主文件的末尾来结束程序,则该文件将包含文本,但这不是我的场景。)

fs.writeFile完美的工作,当你有所有你想要fs.writeFile的文字,但似乎并不支持一次追加一行。

推荐的方法是什么?

编辑:我试过的具体代码:

 var fs = require('fs') var log = fs.createWriteStream('test.log') for (var i = 0; i < 1000000; i++) { console.log(i) log.write(i + '\n') } 

运行几秒钟,点击^ C,留下一个0字节的文件。

NodeJS不能以传统方式工作。 它使用一个单线程,所以通过运行一个大的循环并在里面进行I / O,你不会给它一个机会(例如释放CPU)来执行其他的asynchronous操作,例如:将内存缓冲区刷新到实际的文件。

逻辑必须是 – 执行一次write ,然后将你的函数(调用write)作为callback函数传递给process.nextTick或者作为回写写入stream的drain事件(如果在上次写入期间缓冲区已满)。

这是一个快速和肮脏的版本,这就是你所需要的。 请注意,没有长时间运行的循环或其他CPU堵塞,而是安排我以后的写入,以便将来快速返回,暂时释放CPU以用于其他事情。

 var fs = require('fs') var log = fs.createWriteStream('test.log'); var i = 0; function my_write() { if (i++ < 1000000) { var res = log.write("" + i + "\r\n"); if (!res) { log.on('drain',my_write); } else { process.nextTick(my_write); } console.log("Done" + i + " " + res + "\r\n"); } } my_write(); 

你正在使用for循环写入文件,这是坏的,但这是其他情况。 首先createWriteStream不会自动closures文件,你应该调用close。 如果在for循环之后立即调用close,它将会closures而不写,因为它是asynchronous的。

有关更多信息,请阅读此处: https : //nodejs.org/api/fs.html#fs_fs_createwritestream_path_options

问题是循环内部的asynchronous函数。

结果Node提供了一个较低级别的文件I / O API,似乎工作正常!

 var fs = require('fs') var log = fs.openSync('test.log', 'w') for (var i = 0; i < 100000; i++) { console.log(i) fs.writeSync(log, i + '\n') }