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

时间:2017-02-16 15:00:02

标签: node.js

我正在使用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);

1 个答案:

答案 0 :(得分:4)

您无法在呼叫本身中执行此操作,但您当然可以调用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这样一个简单明了的选项恰好存在于此目的时,我质疑这种方法的价值。它会使程序更难理解,而不会实际添加任何值。

但它会奏效。