我试图追加一个字符串到日志文件。但是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'

有什么简单的方法吗?


当前回答

使用fs。appendFile或fsPromises。当您需要向文件中追加内容时,appendFile是最快和最健壮的选项。

与建议的一些答案相反,如果文件路径提供给appendFile函数,它实际上会自行关闭。只有传入fs.open()之类的文件句柄时,才需要注意关闭它。

我在一个超过5万行的文件中试过。

例子:

(async () => {
  // using appendFile.
  const fsp = require('fs').promises;
  await fsp.appendFile(
    '/path/to/file', '\r\nHello world.'
  );

  // using apickfs; handles error and edge cases better.
  const apickFileStorage = require('apickfs');
  await apickFileStorage.writeLines(
    '/path/to/directory/', 'filename', 'Hello world.'
  );
})();

裁判:https://github.com/nodejs/node/issues/7560

其他回答

你需要打开它,然后写进去。

var fs = require('fs'), str = 'string to append to file';
fs.open('filepath', 'a', 666, function( e, id ) {
  fs.write( id, 'string to append to file', null, 'utf8', function(){
    fs.close(id, function(){
      console.log('file closed');
    });
  });
});

下面是一些有助于解释参数的链接

开放 写 关闭


编辑:这个答案不再有效,请查看新的fs。appendFile追加方法。

尝试使用flags: 'a'将数据附加到文件中

 var stream = fs.createWriteStream("udp-stream.log", {'flags': 'a'});
  stream.once('open', function(fd) {
    stream.write(msg+"\r\n");
  });

使用jfile包:

myFile.text+='\nThis is new line to be appended'; //myFile=new JFile(path);

使用fs。appendFile或fsPromises。当您需要向文件中追加内容时,appendFile是最快和最健壮的选项。

与建议的一些答案相反,如果文件路径提供给appendFile函数,它实际上会自行关闭。只有传入fs.open()之类的文件句柄时,才需要注意关闭它。

我在一个超过5万行的文件中试过。

例子:

(async () => {
  // using appendFile.
  const fsp = require('fs').promises;
  await fsp.appendFile(
    '/path/to/file', '\r\nHello world.'
  );

  // using apickfs; handles error and edge cases better.
  const apickFileStorage = require('apickfs');
  await apickFileStorage.writeLines(
    '/path/to/directory/', 'filename', 'Hello world.'
  );
})();

裁判:https://github.com/nodejs/node/issues/7560

使用createWriteStream的代码为每次写入创建一个文件描述符。日志。End更好,因为它要求节点在写入后立即关闭。

var fs = require('fs');
var logStream = fs.createWriteStream('log.txt', {flags: 'a'});
// use {flags: 'a'} to append and {flags: 'w'} to erase and write a new file
logStream.write('Initial line...');
logStream.end('this is the end line');