为了账号安全,请及时绑定邮箱和手机立即绑定

如何在节点中追加文件?

如何在节点中追加文件?

拉莫斯之舞 2019-07-26 15:14:27
如何在节点中追加文件?我在试着附加日志文件的字符串。但是,写文件在编写字符串之前每次都会删除内容。fs.writeFile('log.txt', 'Hello Node', function (err) {   if (err) throw err;   console.log('It\'s saved!');}); // => message.txt erased, contains only 'Hello Node'知道怎么用简单的方法吗?
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

对于偶尔追加的内容,您可以使用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');

但是,如果您重复添加到同一个文件,则最好是重用文件句柄.



查看完整回答
反对 回复 2019-07-27
?
aluckdog

TA贡献1847条经验 获得超7个赞

当您想要写入日志文件,即将数据附加到文件的末尾时,绝不可能使用appendFileappendFile为添加到文件中的每一段数据打开一个文件句柄,一段时间后,您会得到一个漂亮的文件句柄。EMFILE错误。

我可以说appendFile使用起来并不比WriteStream.

例举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' }

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

如果要附加到文件中,则使用这样的可写流:

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因此,当进程结束时,您的文件将结束,并且避免打开太多的文件。




查看完整回答
反对 回复 2019-07-27
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

使用createWriteStream的代码为每次写入创建一个文件描述符。因为它要求节点在写入后立即关闭,因此log.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');



查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 479 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信