¿Cómo agregar a un archivo en Node?

Resuelto supercobra asked hace 14 años • 18 respuestas

Estoy intentando agregar una cadena a un archivo de registro. Sin embargo, writeFile borrará el contenido cada vez antes de escribir la cadena.

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

¿Alguna idea de cómo hacer esto de manera fácil?

supercobra avatar Aug 11 '10 21:08 supercobra
Aceptado

Para anexos ocasionales, puedes usar appendFile, que crea un nuevo identificador de archivo cada vez que se llama:

Asincrónicamente :

const fs = require('fs');

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

Sincrónicamente :

const fs = require('fs');

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

Pero si agrega repetidamente el mismo archivo, es mucho mejor reutilizar el identificador del archivo .

denysonique avatar Jun 29 '2012 19:06 denysonique

Cuando desee escribir en un archivo de registro, es decir, agregar datos al final de un archivo, nunca use appendFile. appendFileabre un identificador de archivo para cada dato que agrega a su archivo, después de un tiempo obtiene un hermoso EMFILEerror.

Puedo agregar que appendFileno es más fácil de usar que un archivo WriteStream.

Ejemplo con 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());

Hasta 8000 en mi computadora, puedes agregar datos al archivo y luego obtienes esto:

{ 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' }

Además, appendFileescribirá cuando esté habilitado, por lo que sus registros no se escribirán según la marca de tiempo. Puede probar con el ejemplo, establecer 1000 en lugar de 100000, el orden será aleatorio, depende del acceso al archivo.

Si desea agregar a un archivo, debe usar una secuencia de escritura como esta:

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

Lo terminas cuando quieras. Ni siquiera es necesario que use stream.end(), la opción predeterminada es AutoClose:true, por lo que su archivo finalizará cuando finalice su proceso y evitará abrir demasiados archivos.

Plaute avatar Apr 12 '2017 12:04 Plaute

Su código que usa createWriteStream crea un descriptor de archivo para cada escritura. log.end es mejor porque le pide al nodo que se cierre inmediatamente después de la escritura.

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');
Fabio Ferrari avatar Mar 21 '2012 21:03 Fabio Ferrari