如何追加到Node中的文件?

我想追加一个string到日志文件。 不过writeFile会在每次写入string之前擦除内容。

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

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

丹尼尔

asynchronous :

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

同步 :

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

您的代码使用createWriteStream为每个写入创build一个文件描述符。 log.end更好,因为它要求节点在写入后立即closures。

 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'); 

你需要打开它,然后写入它。

 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方法来追加。

节点0.8有fs.appendFile

 fs.appendFile('message.txt', 'data to append', function (err) { if (err) throw err; console.log('The "data to append" was appended to file!'); }); 

文档: http : //nodejs.org/docs/latest/api/fs.html#fs_fs_appendfile_filename_data_encoding_utf8_callback

除了appendFile之外,还可以在writeFile传递一个标志以将数据附加到现有文件。

 fs.writeFile('log.txt', 'Hello Node', {'flag':'a'}, function(err) { if (err) { return console.error(err); } }); 

通过传递标志“a”,数据将被附加在文件的末尾。

当你想写一个日志文件,即附加数据到一个文件的末尾, 永远不会使用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将在启用时写入,所以日志不会被时间戳记写入。 你可以用例子来testing,设置1000代替100000,顺序将是随机的,取决于对文件的访问。

如果你想追加到一个文件,你必须使用这样一个可写的stream:

 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,所以你的文件将在你的进程结束时结束,并且避免打开太多的文件。

 fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a') fs.writeSync(fd, 'contents to append') fs.closeSync(fd) 

这是一个完整的脚本。 填写你的文件名并运行它,它应该工作! 这是一个关于脚本背后逻辑的video教程 。

 var fs = require('fs'); function ReadAppend(file, appendFile){ fs.readFile(appendFile, function (err, data) { if (err) throw err; console.log('File was read'); fs.appendFile(file, data, function (err) { if (err) throw err; console.log('The "data to append" was appended to file!'); }); }); } // edit this with your file names file = 'name_of_main_file.csv'; appendFile = 'name_of_second_file_to_combine.csv'; ReadAppend(file, appendFile); 

我仅仅提供这个build议是因为对打开标志的控制有时是有用的,例如,你可能希望首先截断一个存在的文件, 然后附加一系列的写入 – 在这种情况下打开文件时使用“w”标志并且在所有写入完成之前不要closures它。 当然appendFile可能是你之后:-)

  fs.open('log.txt', 'a', function(err, log) { if (err) throw err; fs.writeFile(log, 'Hello Node', function (err) { if (err) throw err; fs.close(log, function(err) { if (err) throw err; console.log('It\'s saved!'); }); }); }); 

使用jfile包:

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