Escribir en archivos en Node.js

9 minutos de lectura

Escribir en archivos en Nodejs
Gjorgji

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 Nodejs
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:

  1. 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.

  2. fs.writeFile(filename, data, [encoding], callback)

    Todos los datos deben almacenarse al mismo tiempo; no puede realizar escrituras secuenciales.

  3. 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+1la 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() y uncork() 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

1646972176 770 Escribir en archivos en Nodejs
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

Escribir en archivos en Nodejs
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()

1646972178 951 Escribir en archivos en Nodejs
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

1646972179 444 Escribir en archivos en Nodejs
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')

ver documentos aquí para más información

  • 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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad