He estado tratando de encontrar una manera de escribir en un archivo cuando uso Node.js, pero sin éxito. ¿Cómo puedo hacer eso?
Escribir en archivos en Node.js
Gjorgji
Brian McKenna
Hay muchos detalles en el 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!');
-
Probé este script usando Node e intenté cambiar la ruta del archivo a “/home/”, pero recibí el siguiente error:
{ [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
?–Anderson Green
10/09/2012 a las 20:37
-
También tenga en cuenta que puede usar fs.writeFileSync(…) para lograr lo mismo sincrónicamente.
–David Erwin
23 de enero de 2013 a las 18:28
-
Tal vez sea un poco antiguo, pero @AndersonGreen, debe ejecutar el nodo como root o chmod /home correctamente para permitir permisos de lectura y escritura al propietario actual del proceso del nodo (su nombre de usuario es difícil) para que pueda escribir el archivo
– Denys Vitali
2 de enero de 2014 a las 23:34
-
En realidad, @DenysVitali, el problema es que Jane no debería poder escribir ningún archivo en
/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 escribirlo/home/jane/test.txt
. Cambiando/home
a algo más permisivo que 755 es un gran error.– arco de jane
26 de enero de 2014 a las 23:05
-
@JaneAvriette Bueno, ya que quería guardar el archivo en
/home
directorio que sugerí para chmod. Sé que podría generar un problema de seguridad. Pero bueno, si el usuario quiere guardar ahí, esa es la solución. PD: Estoy de acuerdo con lo que dices (:– Denys Vitali
29 de enero de 2014 a las 22:51
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á amortiguado.
-
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
, lo cual es conveniente porque no necesita esperar una devolución de llamada. Pero, de nuevo, no está almacenado en búfer.
A WriteStream
, como su nombre lo dice, es un arroyo. Una secuencia, por definición, es “un búfer” que contiene datos que se mueven en una dirección (fuente ► destino). Pero un flujo grabable no está necesariamente “almacenado en búfer”. Una transmisión se “almacena en búfer” cuando escribes n
tiempos, y en el tiempo n+1
la transmisión envía el búfer al kernel (porque está lleno y debe vaciarse).
En otras palabras: “Un amortiguador” es el objeto. Si está o no “en el búfer” es una propiedad de ese objeto.
Si miras el código, el WriteStream
hereda de un escribible Stream
objeto. Si prestas atención, verás como tiran 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 llenan ningún búfer. Entonces, si lo haces:
write("a")
write("b")
write("c")
Estás haciendo:
fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))
Eso es Tres llamadas a la capa de E/S. Aunque esté utilizando “búferes”, los datos no se almacenan en búfer. Una secuencia almacenada en búfer 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 06/02/2015) ahora admite dos funciones:
cork()
y
uncork()
. Parece que estas funciones finalmente le permitirán almacenar en búfer/vaciar las llamadas de escritura.
Por ejemplo, en Java hay algunas clases que proporcionan flujos almacenados en búfer (BufferedOutputStream
, BufferedWriter
…). Si escribe tres bytes, estos bytes se almacenarán en el búfer (memoria) en lugar de realizar una llamada de E/S solo para tres bytes. Cuando el búfer está lleno, el contenido se vacía y se guarda en el disco. Esto mejora el rendimiento.
No estoy descubriendo nada, solo recordando cómo se debe hacer un acceso al disco.
-
+1 – buena explicación. Para el flujo de escritura, es importante leer los documentos cuidadosamente. Si devuelve falso o se cierra, es importante llamar awriter.once(‘drain’, function(){}) o me perdí líneas que no se habían vaciado cuando finalizó el proceso.
-bryanmac
19 de junio de 2014 a las 15:18
-
cualquier posibilidad de que pueda proporcionar un ejemplo de cómo usar
cork()
yuncork()
para aquellos de nosotros que queremos probar el nodo de versión preliminar 0.11?– profesores maullidos
16 de agosto de 2014 a las 7:05
-
A partir de ahora, Node v0.12 es estable.
– ago
1 de abril de 2015 a las 5:41
-
Según un análisis de código de GitHub, fs.writeFile parece ser la función más popular de las que mencionaste. Aquí están ejemplos del mundo real para usar fs.writeFile
– adormecerse
18 de abril de 2019 a las 20:11
-
¿Hay bibliotecas de calidad de producción en
npm
implementar la escritura en búfer?– nponecop
12 mayo 2019 a las 18:48
fredrick andersson
Por supuesto, puedes hacerlo un poco más avanzado. Sin bloqueo, escribiendo fragmentos, sin escribir todo el archivo a la vez:
var fs = require('fs');
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
stream.write("My first row\n");
stream.write("My second row\n");
stream.end();
});
-
¿Cuál es la variable ‘fd’ pasada a la devolución de llamada para stream.once?
–Scott Tesler
18 de octubre de 2012 a las 5:49
-
Descriptor de archivo @ScottDavidTesler para que pueda cerrar la transmisión una vez que haya terminado con ella.
– Alexey Kamensky
20 de noviembre de 2012 a las 11:32
-
¿Cuándo cierro la transmisión? ¿Por qué esto no bloquea? Solo por curiosidad, estoy tratando de escribir en un archivo de registro.
– Metagurú
3 de enero de 2013 a las 3:06
-
No estoy seguro si cuando la corriente se vacía. Mi conjetura es que existe la posibilidad de vaciar la corriente a pedido.
– Fredrik Anderson
24 de abril de 2013 a las 9:38
-
@JoLiss Tendrás que esperar.
– Fredrik Anderson
12 de noviembre de 2014 a las 15:37
moriarty
Escritura síncrona
fs.writeFileSync(archivo, datos[, options])
fs = require('fs');
fs.writeFileSync("foo.txt", "bar");
Escritura asíncrona
fs.writeFile(archivo, datos[, options]llamar de vuelta)
fs = require('fs');
fs.writeFile('foo.txt', 'bar', (err) => { if (err) throw err; });
Donde
file <string> | <Buffer> | <URL> | <integer> filename or file descriptor
data <string> | <Buffer> | <Uint8Array>
options <Object> | <string>
callback <Function>
Vale la pena leer el sistema de archivos oficial (fs) documentos.
Actualización: asíncrono/espera
fs = require('fs');
util = require('util');
writeFile = util.promisify(fs.writeFile);
fn = async () => { await writeFile('foo.txt', 'bar'); }
fn()
señor p
var path="public/uploads/file.txt",
buffer = new Buffer("some content\n");
fs.open(path, 'w', function(err, fd) {
if (err) {
throw 'error opening file: ' + err;
}
fs.write(fd, buffer, 0, buffer.length, null, function(err) {
if (err) throw 'error writing file: ' + err;
fs.close(fd, function() {
console.log('file written');
})
});
});
-
esto demuestra cómo escribir un archivo usando operaciones fs de nivel inferior. por ejemplo, puede garantizar que el archivo haya terminado de escribirse en el disco y haya liberado los descriptores de archivo.
– Sean Glover
18/01/2015 a las 17:30
-
Dado que en este ejemplo el desplazamiento si se establece en ‘0’ (= tercer parámetro de
fs.write()
) este ejemplo funciona solo si todo es lo suficientemente corto como para escribirse en una sola llamada de escritura.– Manfredo
9 de febrero de 2020 a las 20:14
arquero han
Las respuestas proporcionadas están fechadas y una forma más nueva de hacerlo es:
const fsPromises = require('fs').promises
await fsPromises.writeFile('/path/to/file.txt', 'data to write')
-
esto demuestra cómo escribir un archivo usando operaciones fs de nivel inferior. por ejemplo, puede garantizar que el archivo haya terminado de escribirse en el disco y haya liberado los descriptores de archivo.
– Sean Glover
18/01/2015 a las 17:30
-
Dado que en este ejemplo el desplazamiento si se establece en ‘0’ (= tercer parámetro de
fs.write()
) este ejemplo funciona solo si todo es lo suficientemente corto como para escribirse en una sola llamada de escritura.– Manfredo
9 de febrero de 2020 a las 20:14
me gustó Índice de ./articles/file-system.
Funcionó para mí.
Ver también ¿Cómo escribo archivos en node.js?.
fs = require('fs');
fs.writeFile('helloworld.txt', 'Hello World!', function (err) {
if (err)
return console.log(err);
console.log('Wrote Hello World in file helloworld.txt, just check it');
});
Contenido de holamundo.txt:
Hello World!
Actualizar:
Como en el nodo de Linux escribe en el directorio actual, parece que en otros no, así que agrego este comentario por si acaso:
Usando esto ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH);
para llegar donde está escrito el archivo.
-
¿Dónde encontrar el archivo helloworld.txt? No puedo encontrarlo en ninguna carpeta… gracias.
– Kai Feng masticar
19 de diciembre de 2014 a las 6:58
-
en la carpeta que ejecuta el script
– Sérgio
19 de diciembre de 2014 a las 17:22
-
Eso es raro… Simplemente no puedo encontrarlo en ninguna parte. ¿Estará escondido? gracias de nuevo ~
– Kai Feng masticar
19 de diciembre de 2014 a las 21:51
-
lo acabo de encontrar Usando esto RUTA_APLICACIÓN_RAÍZ = fs.realpathSync(‘.’); consola.log(RUTA_APLICACIÓN_RAÍZ); para obtener mi donde el archivo escrito. Gracias.
– Kai Feng masticar
22 de diciembre de 2014 a las 6:21
-
@Sérgio: ¿necesitamos cerrar el archivo de escritura? Estoy llamando a otro proceso y recibo un mensaje de error sobre el inicio del uso del archivo por parte de otro proceso.
– Emir
19 de diciembre de 2018 a las 16:49