Pregunta Escribir archivos en Node.js


He estado intentando encontrar una manera de escribir en un archivo cuando uso Node.js, pero sin éxito. ¿Cómo puedo hacer eso?


1139
2018-03-23 00:25


origen


Respuestas:


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

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

    console.log("The file was saved!");
}); 

1807
2018-03-23 01:50



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 escribe en el disco. No está tamponado.

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

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

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

    Crea un WriteStream, que es conveniente porque no necesita esperar una devolución de llamada. Pero, de nuevo, no está amortiguado.

UN WriteStream, como su nombre lo dice, es una secuencia. Un flujo por definición es "un buffer" que contiene datos que se mueven en una dirección (fuente ► destino). Pero una secuencia de escritura no necesariamente se "amortigua". Una secuencia se "almacena en el búfer" cuando escribe n veces, y al tiempo n+1, la secuencia envía el búfer al kernel (porque está lleno y necesita enjuagarse).

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

Si miras el código, el WriteStream hereda de una escritura Stream objeto. Si prestas atención, verás cómo limpian el contenido; ellos no tienen ningún sistema de almacenamiento en búfer.

Si escribe una cadena, se convierte en un buffer, 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:

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 llama a la capa de E / S. Aunque está utilizando "búferes", los datos no están almacenados en búfer. Una secuencia de 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 02/06/2015) ahora es compatible con dos funciones: cork() y uncork(). Parece que estas funciones finalmente te permitirán almacenar / descargar las llamadas de escritura.

Por ejemplo, en Java hay algunas clases que proporcionan transmisiones 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 estoy descubriendo nada, solo recuerdo cómo se debe hacer un acceso al disco.


430
2017-08-05 15:28



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

189
2017-12-16 14:40



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');
        })
    });
});

38
2017-11-07 20:54



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 helloworld.txt:

Hello World!

Actualizar:
Como en el nodo Linux escriba 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 a donde está escrito el archivo.


20
2017-10-23 07:54



 var fs = require('fs');
 fs.writeFile(path + "\\message.txt", "Hello", function(err){
 if (err) throw err;
  console.log("success");
}); 

Por ejemplo: leer archivo y escribir en otro archivo:

  var fs = require('fs');
    var path = process.cwd();
    fs.readFile(path+"\\from.txt",function(err,data)
                {
                    if(err)
                        console.log(err)
                    else
                        {
                            fs.writeFile(path+"\\to.text",function(erro){
                                if(erro)
                                    console.log("error : "+erro);
                                else
                                    console.log("success");
                            });
                        }
                });

5
2018-05-17 05:54



Escritura síncrona

fs.writeFileSync (archivo, datos [, opciones])

fs = require('fs');

fs.writeFileSync("synchronous.txt", "synchronous write!")

Escritura asincrónica

fs.writeFile (archivo, datos [, opciones], devolución de llamada)

fs = require('fs');

fs.writeFile('asynchronous.txt', 'asynchronous write!', (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
});

Dónde

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.


4
2017-10-01 05:39



Aquí usamos w + para leer / escribir ambas acciones y si no se encuentra la ruta del archivo, se creará automáticamente.

fs.open(path, 'w+', function(err, data) {
    if (err) {
        console.log("ERROR !! " + err);
    } else {
        fs.write(data, 'content', 0, 'content length', null, function(err) {
            if (err)
                console.log("ERROR !! " + err);
            fs.close(data, function() {
                console.log('written success');
            })
        });
    }
});

Contenido significa lo que tiene que escribir en el archivo y su longitud, 'content.length'.


2
2017-09-01 11:06



Aquí está la muestra de cómo leer el archivo csv desde local y escribir el archivo csv en local.

var csvjson = require('csvjson'),
    fs = require('fs'),
    mongodb = require('mongodb'),
    MongoClient = mongodb.MongoClient,
    mongoDSN = 'mongodb://localhost:27017/test',
    collection;

function uploadcsvModule(){
    var data = fs.readFileSync( '/home/limitless/Downloads/orders_sample.csv', { encoding : 'utf8'});
    var importOptions = {
        delimiter : ',', // optional 
        quote     : '"' // optional 
    },ExportOptions = {
        delimiter   : ",",
        wrap        : false
    }
    var myobj = csvjson.toSchemaObject(data, importOptions)
    var exportArr = [], importArr = [];
    myobj.forEach(d=>{
        if(d.orderId==undefined || d.orderId=='') {
            exportArr.push(d)
        } else {
            importArr.push(d)
        }
    })
    var csv = csvjson.toCSV(exportArr, ExportOptions);
    MongoClient.connect(mongoDSN, function(error, db) {
        collection = db.collection("orders")
        collection.insertMany(importArr, function(err,result){
            fs.writeFile('/home/limitless/Downloads/orders_sample1.csv', csv, { encoding : 'utf8'});
            db.close();
        });            
    })
}

uploadcsvModule()

2
2018-05-04 05:15



Puedes usar la biblioteca easy-file-manager

instalar primero desde npm npm install easy-file-manager

Muestra para cargar y eliminar archivos

var filemanager = require('easy-file-manager')
var path = "/public"
var filename = "test.jpg"
var data; // buffered image

filemanager.upload(path,filename,data,function(err){
    if (err) console.log(err);
});

filemanager.remove(path,"aa,filename,function(isSuccess){
    if (err) console.log(err);
});

1
2018-05-28 00:06