482 votos

Escritura de ficheros en NodeJS

He estado tratando de encontrar una forma de escribir presentar al usar NodeJS pero sin éxito. ¿Usted me puede ayudar con esto?

751voto

Brian McKenna Puntos 10754

Hay muchos detalles en el sistema de archivos API. La forma más común (en cuanto yo sé) es:

var fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log("The file was saved!");
    }
}); 

229voto

Gabriel Llamas Puntos 5808

Actualmente hay 3 formas de escribir un archivo:

  1. fs.write(fd, buffer, offset, length, position, [callback])

    Usted necesidad de esperar a la devolución de llamada para asegurarse de que el buffer está escrito en el disco. No almacenar en búfer.

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

    Todos los datos deben ser almacenados en el mismo tiempo; no se puede realizar escrituras secuenciales.

  3. fs.createWriteStream(path, [options])

    Crea un WriteStream, lo cual es conveniente ya que usted no necesita esperar para una devolución de llamada. Pero de nuevo, no se almacena.

Un WriteStream, como el nombre lo dice, es un flujo. Un arroyo, por definición, es un "buffer" que contiene los datos que se mueve en una dirección (fuente ► destino). Pero una escritura corriente no es necesariamente "buffer". Un stream es "amortiguada" cuando se escribe n veces, y en el tiempo n+1, el flujo envía el buffer del kernel (porque está lleno y debe ser limpiada).

En otras palabras: Un "buffer" es el objeto. Si es o no es "buffer" es una propiedad de ese objeto.

Si se mira el código, la WriteStream hereda de una escritura Stream objeto. Si prestas atención, verás cómo vaciar el contenido; no tienen ningún sistema de amortiguamiento.

Si usted escribe una cadena de texto, se convierte en un buffer, y luego se envía a los nativos de la capa y escriben en el disco. Cuando la escritura de cadenas de caracteres, no estamos llenando de cualquier tampón. Por lo tanto, si usted:

write("a")
write("b")
write("c")

Que estás haciendo:

fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))

Que del 3 llamadas a la capa de e/S. A pesar de que el uso de "buffers", los datos no se almacenan. Una secuencia del búfer haría: fs.write(new Buffer ("abc")), 1 llamada a la capa de e/S.

La próxima versión de Nodo (v0.12) tendrá 2 funciones: cork() y uncork(). Parece que estas funciones, finalmente, permitirá a buffer/vaciar la escritura de llamadas.

Por ejemplo, en Java hay algunas clases que proporcionan tamponada de los arroyos (BufferedOutputStream, BufferedWriter...). Si escribes 3 bytes, estos bytes se almacenan en el búfer (memoria) en lugar de hacer una llamada de e/S sólo por 3 bytes. Cuando el buffer se llena, el contenido es descargado y guardado en el disco. Esto mejora el rendimiento.

No estoy descubriendo nada, tan sólo recordar cómo un disco de acceso debe ser hecho.

95voto

Fredrik Andersson Puntos 521

Por supuesto puedes hacerlo un poco más adelantado. Sin bloqueo, escritura bits y piezas, no 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();
});

16voto

Mister P Puntos 206
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;
    } else {
        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');
            })
        });
    }
});

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X