Estoy tratando de 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 la manera fácil?
process.exit()
justo despuésfs.appendFile
, puede salir antes de que se envíe la salida. (Usarreturn
está bien.)appendFileSync
. nodejs.org/api/… Pero puede perder uno de los grandes beneficios de Node, que son las operaciones asíncronas. Asegúrate de atrapar los errores. Quizás en algunos sistemas operativos, puede obtener acceso denegado si solicita el identificador de archivo al mismo tiempo. No estoy seguro de eso.Cuando desee escribir en un archivo de registro, es decir, agregar datos al final de un archivo, nunca lo use
appendFile
.appendFile
abre un identificador de archivo para cada pieza de datos que agrega a su archivo, después de un tiempo obtiene un hermosoEMFILE
error.Puedo agregar que
appendFile
no es más fácil de usar que aWriteStream
.Ejemplo con
appendFile
:Hasta 8000 en mi computadora, puede agregar datos al archivo, luego obtiene esto:
Además,
appendFile
escribirá cuando esté habilitado, por lo que sus registros no se escribirán con 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:
Lo terminas cuando quieres. Ni siquiera está obligado a usar
stream.end()
, la opción predeterminada esAutoClose:true
, por lo que su archivo finalizará cuando finalice su proceso y evite abrir demasiados archivos.fuente
stream.end()
antes questream.write()
, por lo que no deberíamos usarstream.end()
, también, como mencionaste,AutoClose:True
es una opción predeterminada, ¿por qué molestarse en escribir una línea que no es válida? utilizar.due to asynchronous nature of Javascript
... ¿Qué? Array.forEach es una operación sincrónica. JS es sincrónico. Simplemente proporciona algunas formas de administrar operaciones asincrónicas, como Promesas y async / wait.fs.appendFile
resultado demasiados archivos abiertos porque lo ejecuta de manera asincrónica (solo está creando asincrónicamente el identificador de archivos 10000), creoappendFileSync
que no tendría un problema similar, tampocofs.appendFile
con el intervalo adecuado (1s es probablemente más que suficiente) o haciendo cola.Su código usando 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.
fuente
var fs = require('graceful-fs')
, que resolvió algunos problemas conocidos. Vea los documentos para más información.fs.createWriteStream
, entonces useflags
. Si está utilizando,fs.writeFile
entonces esflag
. Consulte Nodo JS Docs - Sistema de archivos para obtener más información.Además
appendFile
, también puede pasar una banderawriteFile
para agregar datos a un archivo existente.Al pasar la marca 'a', los datos se agregarán al final del archivo.
fuente
fs.createWriteStream
, entonces useflags
. Si está utilizando,fs.writeFile
entonces esflag
. Consulte Nodo JS Docs - Sistema de archivos para obtener más información.Debe abrirlo y luego escribirle.
Aquí hay algunos enlaces que ayudarán a explicar los parámetros.
abrir
escribir
cerrar
EDITAR : Esta respuesta ya no es válida, busque el nuevo método fs.appendFile para agregar .
fuente
Node.js 0.8 tiene
fs.appendFile
:Documentación
fuente
fuente
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 :
Probado con Nodo v8.9.4.
fuente
Mi enfoque es bastante especial. Básicamente uso la
WriteStream
solución pero sin realmente 'cerrar' el fd usandostream.end()
. En cambio usocork
/uncork
. Esto obtuvo el beneficio del uso bajo de RAM (si eso es importante para alguien) y creo que es más seguro usarlo para iniciar sesión / grabar (mi caso de uso original).El siguiente es un ejemplo bastante simple. Tenga en cuenta que acabo de agregar un pseudo
for
bucle para mostrar: en el código de producción estoy esperando los mensajes de websocket.uncork
vaciará los datos al archivo en el siguiente tic.En mi escenario, hay picos de hasta ~ 200 escrituras por segundo en varios tamaños. Durante la noche, sin embargo, solo se necesitan unas pocas escrituras por minuto. El código funciona súper confiable incluso durante las horas pico.
fuente
Ofrezco esta sugerencia solo porque el control sobre las marcas abiertas a veces es útil, por ejemplo, es posible que desee truncar primero un archivo existente y luego agregarle una serie de escrituras, en cuyo caso use la bandera 'w' al abrir el archivo y no lo cierre hasta que todas las escrituras estén terminadas. Por supuesto, appendFile puede ser lo que buscas :-)
fuente
Usando el paquete jfile :
fuente
Usar
fs.appendFile
ofsPromises.appendFile
son las opciones más rápidas y sólidas cuando necesita agregar algo a un archivo.A diferencia de algunas de las respuestas sugeridas, si la ruta del archivo se proporciona a la
appendFile
función, en realidad se cierra sola . Solo cuando pasa un identificador de archivo que pasa por algo así comofs.open()
tiene que encargarse de cerrarlo.Lo probé con más de 50,000 líneas en un archivo.
Ejemplos:
Ref: https://github.com/nodejs/node/issues/7560
Ejecución de ejemplo: https://github.com/apickjs/apickFS/blob/master/writeLines.js
fuente
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 guión.
fuente
una manera más fácil de hacer esto es
fuente
appendFileSync
solución?fuente
Además de la respuesta de denysonique , a veces
appendFile
se utilizan tipos asíncronos y otros métodos asíncronos en NodeJS donde se devuelve la promesa en lugar de pasar la devolución de llamada. Para hacerlo, debe ajustar la función conpromisify
HOF o importar funciones asíncronas desde el espacio de nombres de promesas:Espero que ayude 😉
fuente