如何附加到节点中的文件?

2022-08-29 22:33:55

我正在尝试将字符串附加到日志文件。但是,writeFile 每次在写入字符串之前都会擦除内容。

fs.writeFile('log.txt', 'Hello Node', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
}); // => message.txt erased, contains only 'Hello Node'

任何想法如何做到这一点的简单方法?


答案 1

对于偶尔的追加,可以使用 ,每次调用时都会创建一个新的文件句柄:appendFile

异步

const fs = require('fs');

fs.appendFile('message.txt', 'data to append', function (err) {
  if (err) throw err;
  console.log('Saved!');
});

同步

const fs = require('fs');

fs.appendFileSync('message.txt', 'data to append');

但是,如果重复附加到同一文件,则最好重用文件句柄


答案 2

如果要写入日志文件,即将数据附加到文件末尾,切勿使用 。 为您添加到文件中的每条数据打开一个文件句柄,过了一会儿,您会得到一个漂亮的错误。appendFileappendFileEMFILE

我可以补充一点,这并不比.appendFileWriteStream

示例:appendFile

console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
    fs.appendFile("append.txt", index+ "\n", function (err) {
        if (err) console.log(err);
    });
});
console.log(new Date().toISOString());

在我的计算机上最多 8000 个,您可以将数据附加到文件中,然后获取以下内容:

{ Error: EMFILE: too many open files, open 'C:\mypath\append.txt'
    at Error (native)
  errno: -4066,
  code: 'EMFILE',
  syscall: 'open',
  path: 'C:\\mypath\\append.txt' }

此外,启用时将写入,因此您的日志不会按时间戳写入。你可以用例子测试,设置1000代替100000,顺序将是随机的,取决于对文件的访问。appendFile

如果要追加到文件,则必须使用可写流,如下所示:

var stream = fs.createWriteStream("append.txt", {flags:'a'});
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
    stream.write(index + "\n");
});
console.log(new Date().toISOString());
stream.end();

你可以在想要的时候结束它。您甚至不需要使用 ,默认选项是 ,因此您的文件将在进程结束时结束,并且您避免打开太多文件。stream.end()AutoClose:true