node.js - tutorial - npm
¿Cómo adjuntar a un archivo en Nodo? (12)
Estoy tratando de añadir una cadena a un archivo de registro. Sin embargo, writeFile borrará el contenido cada vez que escriba 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?
Daniel
Además de appendFile
, también puede pasar una writeFile
en writeFile
para agregar datos a un archivo existente.
fs.writeFile(''log.txt'', ''Hello Node'', {''flag'':''a''}, function(err) {
if (err) {
return console.error(err);
}
});
Al pasar el indicador ''a'', los datos se agregarán al final del archivo.
Aquí hay un guión completo. ¡Rellene 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);
Cuando desea escribir en un archivo de registro, es decir, agregar datos al final de un archivo, nunca usa appendFile
, appendFile
abre un identificador de archivo para cada parte de los datos que agrega a su archivo, después de un tiempo, appendFile
un hermoso error EMFILE
.
Puedo agregar que appendFile
no es más fácil de usar que 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 adjuntar datos al archivo, 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, 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 adjuntar 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 quieres. Ni siquiera es necesario que use stream.end()
, la opción predeterminada es AutoClose:true
, por lo que su archivo finalizará cuando finalice el proceso y evitará abrir demasiados archivos.
El nodo 0.8 tiene 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!'');
});
Docs: http://nodejs.org/docs/latest/api/fs.html#fs_fs_appendfile_filename_data_encoding_utf8_callback
Necesitas abrirlo, luego escribirlo.
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 ayudarán a explicar los parámetros.
EDITAR : esta respuesta ya no es válida, busque en el nuevo método nodejs.org/api/… para nodejs.org/api/… .
Ofrezco esta sugerencia solo porque el control sobre las banderas abiertas a veces es útil, por ejemplo, es posible que desee truncarlo primero en un archivo existente y luego agregarle una serie de escrituras, en cuyo caso use la bandera ''w'' al abrir el archivo y no lo cierres hasta que todas las escrituras estén hechas. Por supuesto, appendFile puede ser lo que buscas :-)
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!'');
});
});
});
Para anexos ocasionales, puede usar appendFile
, que crea un nuevo identificador de archivo cada vez que se llama:
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'');
Pero si agrega varias veces al mismo archivo, es mucho mejor reutilizar el identificador de archivo .
Si desea una forma fácil y sin estrés de escribir registros línea por línea en un archivo, le recomiendo fs-extra :
const os = require(''os'');
const fs = require(''fs-extra'');
const file = ''logfile.txt'';
const options = {flag: ''a''};
async function writeToFile(text) {
await fs.outputFile(file, `${text}${os.EOL}`, options);
}
writeToFile(''First line'');
writeToFile(''Second line'');
writeToFile(''Third line'');
writeToFile(''Fourth line'');
writeToFile(''Fifth line'');
Probado con Nodo v8.9.4.
Su código que utiliza 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'');
Una forma más fácil de hacer esto es
const fs = require(''fs'');
fs.appendFileSync(''file.txt'', ''message to append into file'');
Usando el paquete jfile :
myFile.text+=''/nThis is new line to be appended''; //myFile=new JFile(path);
fd = fs.openSync(path.join(process.cwd(), ''log.txt''), ''a'')
fs.writeSync(fd, ''contents to append'')
fs.closeSync(fd)