He estado tratando de encontrar una manera de escribir en un archivo cuando uso Node.js, pero sin éxito. ¿Cómo puedo hacer eso?
1646
Hay muchos detalles en la API del sistema de archivos . La forma más común es:
const fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
{ [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' }
¿Cómo puedo modificar este script para que funcione fuera de/tmp
?/home/...
. Generalmente ese directorio es 755 root: wheel (o lo que sea). Si el nodo quiere escribir un archivo como Jane, será más fácil escribir en él/home/jane/test.txt
. Cambiar/home
a algo más permisivo que 755 es un gran error./home
directorio, sugerí cambiarlo. Sé que podría generar un problema de seguridad. Pero bueno, si el usuario quiere ahorrar allí, esa es la solución. PD: Estoy de acuerdo con lo que dijiste (:Actualmente hay tres formas de escribir un archivo:
fs.write(fd, buffer, offset, length, position, callback
)Debe esperar la devolución de llamada para asegurarse de que el búfer se escriba en el disco. No está protegido.
fs.writeFile(filename, data, [encoding], callback)
Todos los datos deben almacenarse al mismo tiempo; No puede realizar escrituras secuenciales.
fs.createWriteStream(path, [options]
)Crea un
WriteStream
, que es conveniente porque no necesita esperar una devolución de llamada. Pero de nuevo, no está protegido.A
WriteStream
, como su nombre lo dice, es una corriente. Una secuencia, por definición, es "un búfer" que contiene datos que se mueven en una dirección (origen ► destino). Pero una secuencia de escritura no está necesariamente "almacenada". Una secuencia se “almacena en búfer” cuando escriben
tiempos, y en ese momenton+1
, la secuencia envía el búfer al núcleo (porque está lleno y necesita ser vaciado).En otras palabras: "Un búfer" es el objeto. Si está o no "almacenado" es una propiedad de ese objeto.
Si observa el código, el
WriteStream
hereda de unStream
objeto grabable . Si prestas atención, verás cómo eliminan el contenido; No tienen ningún sistema de almacenamiento en búfer.Si escribe una cadena, se convierte en un búfer y luego se envía a la capa nativa y se escribe en el disco. Al escribir cadenas, no están llenando ningún búfer. Entonces, si lo haces:
Estás haciendo:
Son tres llamadas a la capa de E / S. Aunque está utilizando "buffers", los datos no están almacenados. Una secuencia almacenada haría:
fs.write(new Buffer ("abc"))
una llamada a la capa de E / S.A partir de ahora, en Node.js v0.12 (versión estable anunciada el 02/02/2015) ahora admite dos funciones:
cork()
yuncork()
. Parece que estas funciones finalmente le permitirán almacenar / borrar las llamadas de escritura.Por ejemplo, en Java hay algunas clases que proporcionan secuencias almacenadas en búfer (
BufferedOutputStream
,BufferedWriter
...). Si escribe tres bytes, estos bytes se almacenarán en el búfer (memoria) en lugar de hacer una llamada de E / S solo por tres bytes. Cuando el búfer está lleno, el contenido se vacía y se guarda en el disco. Esto mejora el rendimiento.No descubro nada, solo recuerdo cómo se debe hacer un acceso al disco.
fuente
cork()
yuncork()
para aquellos de nosotros que queremos probar el nodo de pre-lanzamiento 0.11?npm
implementación de la escritura en búfer?Por supuesto, puedes hacerlo un poco más avanzado. Sin bloqueo, escribiendo bits y piezas, no escribiendo todo el archivo a la vez:
fuente
Escritura Sincrónica
Escritura asincrónica
Dónde
Vale la pena leer el archivo oficial del sistema (fs) docs .
fuente
fuente
fs.write()
) este ejemplo solo funciona si todo es lo suficientemente corto como para escribirse en una sola llamada de escritura.Me gustó Index of ./articles/file-system .
Funcionó para mi.
Consulte también ¿Cómo escribo archivos en node.js? .
Contenido de helloworld.txt:
Actualización:
Al igual que en el nodo de Linux, escriba en el directorio actual, parece que en otros no, así que agrego este comentario por si acaso:
Utilizando esto
ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH);
para llegar a donde se escribe el archivo.fuente
Las respuestas proporcionadas son anticuadas y una nueva forma de hacerlo es:
ver documentos aquí para más información
fuente
(node:23759) ExperimentalWarning: The fs.promises API is experimental
v10.15.0
Sé que la pregunta sobre "escribir", pero en un sentido más general, "agregar" podría ser útil en algunos casos, ya que es fácil de usar en un bucle para agregar texto a un archivo (ya sea que el archivo exista o no). Utilice un "\ n" si desea agregar líneas, por ejemplo:
fuente
const
lugar devar
, es decirconst fs = require('fs');
, para evitar efectos secundarios no deseados, en particular si está trabajando con una base de código algo más grande.OK, es bastante simple ya que Node tiene una funcionalidad incorporada para esto, se llama
fs
que significa Sistema de archivos y, básicamente, el módulo del Sistema de archivos NodeJS ...Así que primero pídalo en su archivo server.js como este:
fs
tiene pocos métodos para escribir en el archivo, pero mi forma preferida es usarloappendFile
, esto agregará las cosas al archivo y si el archivo no existe, creará uno, el código podría ser el siguiente:fuente
Por ejemplo: leer el archivo y escribir en otro archivo:
fuente
writeFile
?Puede escribir en un archivo usando el módulo fs (sistema de archivos).
Aquí hay un ejemplo de cómo puedes hacerlo:
También es posible que desee deshacerse de esta estructura de código de devolución de llamada dentro de devolución de llamada utilizando Promesas y declaraciones
async
/await
. Esto hará que la estructura del código asíncrono sea mucho más plana. Para ello, se puede utilizar una útil función util.promisify (original) . Nos permite cambiar de devoluciones de llamada a promesas. Eche un vistazo al ejemplo con lasfs
funciones a continuación:fuente
Aquí usamos w + para leer / escribir ambas acciones y si no se encuentra la ruta del archivo, se creará automáticamente.
Contenido significa lo que tiene que escribir en el archivo y su longitud, 'content.length'.
fuente
Aquí está la muestra de cómo leer el archivo csv desde local y escribir el archivo csv en local.
fuente
Después, leyendo este largo artículo. Debes entender cómo funciona. Entonces, aquí hay un ejemplo de
createWriteStream()
.fuente
createWriteStream
ya se mencionó en múltiples respuestas años antes de esta.Puedes usar la biblioteca
easy-file-manager
instalar primero desde npm
npm install easy-file-manager
Muestra para cargar y eliminar archivos
fuente
This modules is created to save and remove files.
. No es una respuestaPuede escribir en un archivo con el siguiente ejemplo de código:
fuente
writeFile
ya se había dado como respuesta varias veces, hace años. ¿Qué agrega esta respuesta?