如何让Node.js的fs.appendFile方法立即刷新到磁盘?

5hcedyr0  于 5个月前  发布在  Node.js
关注(0)|答案(2)|浏览(66)

我正在使用appendFile方法将内容追加到文件中。下面是该代码的简化版本。它足以解释问题。我的问题是,如果进程被杀死,文件的内容会滞后于通过appendFile写入的最后数据。换句话说,所有传递到fs.appendFile以获得追加的数据不会写入磁盘。如何绕过此限制?我不喜欢使用任何fs方法的sync版本

fs = require('fs');
  myVal       = 1;

  setInterval (function() {
   ++myVal;
    fs.appendFile("/tmp/test.d", myVal +":",'utf8', function(err) {
       console.log(myVal);
    });
  }, 10000);

字符串
~

uinbv5nw

uinbv5nw1#

你不能在调用本身中这样做,但是你当然可以调用fs.fdatasync()来刷新之前对磁盘的写入。要做到这一点,你必须改变appendFile调用,使用之前打开的文件描述符而不是字符串文件名,所以你最终会有三个步骤:

// Open the file
fs.open(filename, "a+",(err, fd) => {
    // Write our data
    fs.writeFile(fd, data, (err) => {
        // Force the file to be flushed
        fs.fdatasync(fd /*, optional callback here */);
    });
});

字符串
确保在完成后关闭文件。就我个人而言,当appendFileSync这样一个简单而明显的选项存在时,我质疑这种方法的价值。它会使程序更难理解,实际上没有增加任何价值。
但会有用的。

e4yzc0pl

e4yzc0pl2#

从版本21开始,Node现在支持“flush”参数。
像这样使用它:

await fs.promises.appendFile(path, data, { flush: true });

字符串
请参阅使用文档了解更多信息。

相关问题