我正在尝试将字符串附加到日志文件中。但是 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'
知道如何以简单的方式做到这一点吗?
我正在尝试将字符串附加到日志文件中。但是 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'
知道如何以简单的方式做到这一点吗?
当您想写入日志文件时,即将数据附加到文件末尾时,切勿使用appendFile
. appendFile
为您添加到文件中的每条数据打开一个文件句柄,一段时间后您会收到一个漂亮的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
,因此您的文件将在您的进程结束时结束,并且您可以避免打开太多文件。
您使用 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');
此外appendFile
,您还可以传入一个标志writeFile
以将数据附加到现有文件中。
fs.writeFile('log.txt', 'Hello Node', {'flag':'a'}, function(err) {
if (err) {
return console.error(err);
}
});
通过传递标志'a',数据将被附加到文件的末尾。
您需要打开它,然后写入。
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方法。