Запись файлов в узел.js



Я пытался найти способ писать в файл при использовании узла.JS, но без успеха. Как я могу это сделать?

665   12  

12 ответов:

есть много деталей в API файловой системы. Самый распространенный способ (насколько я знаю):

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

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

в настоящее время существует три способа записи файла:

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

    вам нужно дождаться обратного вызова, чтобы убедиться, что буфер записан на диск. Он не буферизован.

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

    все данные должны храниться одновременно; вы не можете выполнять последовательное пишет.

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

    создает WriteStream, что удобно, потому что вам не нужно ждать обратного вызова. Но опять же, это не буферизуется.

A WriteStream, как говорится в названии, это поток. Поток по определению является "буфером", содержащим данные, которые перемещаются в одном направлении (источник ► назначение). Но записываемый поток не обязательно "буферизуется". Поток "буферизуется", когда вы пишете n раз, и во время n+1, поток отправляет буфер ядру (потому что он заполнен и должен быть сброшен).

другими словами: "буфер" - это объект. Независимо от того, является ли он" буферизованным", это свойство этого объекта.

если вы посмотрите на код,WriteStream наследует от записи

вы можете, конечно, сделать его немного более продвинутым. Неблокирующий, пишущий биты и куски, не записывая весь файл сразу:

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

мне понравилось из ./ статьи / файловая система.

это сработало для меня.

см. также как я могу писать файлы в узле.Джей?.

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

содержание helloworld.txt:

Hello World!

обновление:
Как и в Linux узел записи в текущем каталоге, кажется, в некоторых других нет, поэтому я добавляю этот комментарий на всякий случай:
Используя это ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH); чтобы получить, где файл записан.

Синхронной Записи

fs.writeFileSync (file, data[, options])

fs = require('fs');

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

Асинхронную Запись

fs.writeFile (file, data[, options], callback)

fs = require('fs');

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

здесь

file <string> | <Buffer> | <URL> | <integer> filename or file descriptor
data <string> | <Buffer> | <Uint8Array>
options <Object> | <string>
callback <Function>

стоит прочитать официальную файловую систему (fs) docs.

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

например: чтение файла и запись в другой файл:

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

Я знаю вопрос, заданный о "write", но в более общем смысле" append " может быть полезен в некоторых случаях, поскольку его легко использовать в цикле для добавления текста в файл (независимо от того, существует ли файл или нет). Используйте "\n", если вы хотите добавить строки, например:

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}

здесь мы используем w+ для чтения / записи обоих действий, и если путь к файлу не найден, он будет создан автоматически.

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

содержание означает, что вы должны записать в файл и его продолжительность, содержание.длина".

вот пример того, как читать csv-файл из локального и записывать csv-файл в локальный.

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()

вы можете использовать библиотеку easy-file-manager

установить с НПМ npm install easy-file-manager

образец для загрузки и удаления файлов

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

вы можете записать в файл с помощью fs (файловой системы) модуль.

вот пример того, как вы можете это сделать:

const fs = require('fs');

const writeToFile = (fileName, callback) => {
  fs.open(fileName, 'wx', (error, fileDescriptor) => {
    if (!error && fileDescriptor) {
      // Do something with the file here ...
      fs.writeFile(fileDescriptor, newData, (error) => {
        if (!error) {
          fs.close(fileDescriptor, (error) => {
            if (!error) {
              callback(false);
            } else {
              callback('Error closing the file');
            }
          });
        } else {
          callback('Error writing to new file');
        }
      });
    } else {
      callback('Could not create new file, it may already exists');
    }
  });
};

вы также можете избавиться от этой структуры кода обратного вызова-внутри-обратного вызова, используя обещания и async/await заявления. Это сделает структуру асинхронного кода гораздо более плоской. Для этого есть удобный util.promisify(оригинал)

Comments

    Ничего не найдено.