2010-08-11 12 views
305

Estoy tratando de anexar una cadena a un archivo de registro. Sin embargo, writeFile borrará el contenido cada vez antes de escribir la cadena.¿Cómo anexar a un archivo en el nodo?

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 hacerlo de la manera más fácil?

Daniel

+10

Puede escribir su respuesta como respuesta a su pregunta y aceptar esa respuesta. De esta manera, las cosas están más organizadas, y está claro que has encontrado tu respuesta. – strager

Respuesta

476

Para APPENDs ocasionales, puede utilizar appendFile, lo que crea un nuevo identificador de archivo cada vez que se llama:

Asynchronously:

const fs = require('fs'); 

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

Synchronously:

const fs = require('fs'); 

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

Pero si agrega repetidamente al mismo archivo, es mucho mejor a reuse the file handle.

+6

Desde el nodo v0.8.0 – denysonique

+46

¿Alguien sabe si ** fs.appendapile ** mantiene un enlace al archivo abierto para que los enlaces sean más rápidos? (en lugar de abrir/cerrar cada escritura) http://nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_encoding_utf8_callback – nelsonic

+3

@nelsonic De acuerdo con el código fuente, no hay un tratamiento particular. –

19

es necesario abrir, a continuación, escribir en él.

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

Aquí hay algunos enlaces que le ayudarán a explicar los parámetros

open
write
close


EDIT: Esta respuesta ya no es válida, mira en el nuevo fs.appendFile método para agregar.

+1

parece que supercobra escribe constantemente el registro en el archivo de registro, el uso de fs.write no se recomienda en este caso, use fs.createWriteStream en su lugar. Lee http://nodejs.org/docs/v0.4.8/api/all.html#fs.write –

+10

La respuesta ya no es precisa a partir de nodejs v0.4.10. –

+0

@RubenTan ¿por qué es eso? – enyo

87

El código que utiliza createWriteStream crea un descriptor de archivo para cada escritura. log.end es mejor porque le pide al nodo que 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'); 
+4

falta la primera línea! debería ser 'var fs = require (' fs ');' – Stormbytes

+2

O tal vez incluso mejor 'var fs = require ('graceful-fs')', que solucionó algunos problemas conocidos. Consulte los [documentos] (https://github.com/isaacs/node-graceful-fs) para obtener más información. –

+1

Tanto la línea inicial como la línea final están en la misma línea: -p – binki

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

anything sync() casi siempre es una mala idea a menos que esté 100% seguro de que absolutamente lo NECESITA. Incluso entonces, probablemente lo estás haciendo mal. –

+4

No significa que sea incorrecto. Simplemente lo hace de forma sincrónica. Puede que no sea la mejor práctica para Node.js, pero es compatible. –

+2

Estaba usando "ur doin it wrong" en el sentido coloquial internet-meme de la frase. Obviamente es compatible = P –

0

aquí hay un guión completo. ¡Complete sus nombres de archivo y ejecútelo y debería funcionar! Aquí hay un video tutorial sobre la lógica detrás del script.

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

ofrezco esta sugerencia sólo por el control de las banderas abiertas a veces es útil, por ejemplo, es posible que desee truncar un archivo existente primero y continuación añadir una serie de escrituras en ella - en cuyo caso se utilizará el indicador 'w' cuando abre el archivo y no lo cierra hasta que todas las escrituras hayan finalizado. Por supuesto appendfile puede ser lo que está buscando :-)

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!'); 
     }); 
    }); 
    }); 
12

Además appendFile, también puede pasar una bandera en writeFile para añadir datos a un archivo existente.

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

Al pasar la bandera 'a', los datos se anexarán al final del archivo.

+2

** Tenga en cuenta **: Si está utilizando 'fs.createWriteStream', entonces usa 'flags'. Si está usando 'fs.writeFile', entonces es' flag'. Consulte [Nodo JS Docs - Sistema de archivos] (https://nodejs.org/api/fs.html) para obtener más información. –

2

Usando jfile paquete:

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

Cuando se desea escribir en un archivo de registro, es decir, añadir datos al final de un archivo, Nunca utiliza appendFile, appendFile abre un identificador de archivo para cada pieza de datos que agregue a su archivo, después de un tiempo obtendrá un hermoso error EMFILE.

Puedo agregar que appendFile no es más fácil de usar que un 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 equipo, puede anexar los datos en el fichero, a continuación, se obtiene lo siguiente:

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

Por otra parte, appendFile escribirá cuando está habilitado, por lo que sus registros no se escribirán por 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 anexar a un archivo, se debe utilizar una corriente puede escribir así:

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

Se termina cuando lo desee. Ni siquiera está obligado a utilizar stream.end(), la opción predeterminada es AutoClose:true, por lo que su archivo finalizará cuando finalice su proceso y evitará abrir demasiados archivos.

+2

Esta debería ser la respuesta aceptada. –

+0

Gran respuesta, aprendí algo nuevo aquí – Richlewis

Cuestiones relacionadas