it-swarm.com.ru

Запись файлов в Node.js

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

1311
Gjorgji

Есть много деталей в файловая система API . Наиболее распространенный способ:

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

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

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

  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 наследуется от доступного для записи объекта Stream. Если вы обратите внимание, вы увидите, как они очищают контент; у них нет никакой системы буферизации.

Если вы пишете строку, она преобразуется в буфер, а затем отправляется на собственный уровень и записывается на диск. При написании строк они не заполняют какой-либо буфер. Итак, если вы делаете:

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

Ты делаешь:

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

Это три вызовы уровня ввода/вывода. Хотя вы используете «буферы», данные не буферизируются. Буферизованный поток будет выполнять: fs.write(new Buffer ("abc")), один вызов уровня ввода/вывода.

На данный момент в Node.js v0.12 (стабильная версия объявлена ​​06/06/2015) теперь поддерживаются две функции: cork() и uncork() . Кажется, что эти функции, наконец, позволят вам буферизовать/сбрасывать вызовы записи.

Например, в Java есть некоторые классы, которые предоставляют буферизованные потоки (BufferedOutputStream, BufferedWriter...). Если вы записываете три байта, эти байты будут храниться в буфере (памяти) вместо того, чтобы выполнять вызов ввода-вывода только для трех байтов. Когда буфер заполнен, содержимое сбрасывается и сохраняется на диск. Это улучшает производительность.

Я ничего не открываю, просто вспоминаю, как должен осуществляться доступ к диску.

474
Gabriel Llamas

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

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();
});
216
Fredrik Andersson
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');
        })
    });
});
42
Mister P

Мне понравилось Индекс ./articles/file-system.

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

Смотрите также Как мне записать файлы в 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');
});

Содержимое helloworld.txt:

Hello World!

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

26
Sérgio

Синхронная запись

fs.writeFileSync (файл, данные [ параметры])

fs = require('fs');

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

Асинхронная запись

fs.writeFile (файл, данные [ параметры], обратный вызов)

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 .

21
Moriarty

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

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}
9
Astra Bear
 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");
                            });
                        }
                });
7
Masoud Siahkali

Здесь мы используем 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');
            })
        });
    }
});

Контент означает, что вы должны записать в файл и его длину, «content.length».

4
Gunjan Patel

Вы можете записать в файл, используя модуль 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');
    }
  });
};

Возможно, вы также захотите избавиться от этой структуры кода callback-inside-callback с помощью операторов Promises и async/await. Это сделает асинхронную структуру кода намного более плоской. Для этого есть удобная функция util.promisify (оригинал) . Это позволяет нам переключаться с обратных вызовов на обещания. Посмотрите на пример с функциями fs ниже:

// Dependencies.
const util = require('util');
const fs = require('fs');

// Promisify "error-back" functions.
const fsOpen = util.promisify(fs.open);
const fsWrite = util.promisify(fs.writeFile);
const fsClose = util.promisify(fs.close);

// Now we may create 'async' function with 'await's.
async function doSomethingWithFile(fileName) {
  const fileDescriptor = await fsOpen(fileName, 'wx');
  
  // Do something with the file here...
  
  await fsWrite(fileDescriptor, newData);
  await fsClose(fileDescriptor);
}

4
Oleksii Trekhleb

Вот пример того, как прочитать файл 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()
3
KARTHIKEYAN.A

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

сначала установите с npm 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);
});
2
Christoper

Вы можете записать в файл следующий пример кода:

  var data = [{'test': '123', 'test2': 'Lorem Ipsem '}];        
  fs.open(datapath + '/data/topplayers.json', 'wx', function(error, fileDescriptor){        
    if(!error && fileDescriptor){        
        var stringData = JSON.stringify(data);        
        fs.writeFile(fileDescriptor, stringData, function(error){        
            if(!error){        
                fs.close(fileDescriptor, function(error){        
                    if(!error){        
                        callback(false);        
                    }else{        
                        callback('Error in close file');        
                    }        
                });        
            }else{        
                callback('Error in writing file.');        
            }        
        });        
    }        
}        
2
Mudassir

Предоставленные ответы датированы, и новый способ сделать это:

const fsPromises = require('fs').promises
await fsPromises.writeFile('/path/to/file.txt', 'data to write')

см. документ здесь для получения дополнительной информации

1
TrevTheDev

Хорошо, это довольно просто, поскольку Node имеет встроенную функциональность для этого, он называется fs, что означает Файловая система и, в основном, Модуль файловой системы NodeJS ...

Поэтому сначала запишите это в ваш файл server.js , например так:

var fs = require('fs');

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

fs.appendFile('myFile.txt', 'Hi ALi!', function (err) {
  if (err) throw err;
  console.log('Thanks, It's saved to the file!');
});
1
Alireza

fs.createWriteStream(path[,options])

options может также включать параметр start, позволяющий записывать данные в некоторой позиции после начала файла. Для изменения файла вместо его замены может потребоваться режим flagsr+, а не режим по умолчанию w. Кодировка может быть любой из тех, которые приняты Buffer .

Если для autoClose установлено значение true (поведение по умолчанию) для 'error' или 'finish', дескриптор файла будет автоматически закрыт. Если autoClose равен false, дескриптор файла не будет закрыт, даже если произошла ошибка. Приложение должно закрыть его и убедиться в отсутствии утечки файлового дескриптора.

Как ReadStream , если указано fd, WriteStream проигнорирует аргумент path и будет использовать указанный дескриптор файла. Это означает, что событие 'open' не будет отправлено. fd должен быть блокирующим; неблокирующие fds должны быть переданы в net.Socket .

Если options является строкой, то она указывает кодировку.

После прочтения этой длинной статьи. Вы должны понимать, как это работает . Итак, вот пример createWriteStream().

/* The fs.createWriteStream() returns an (WritableStream {aka} internal.Writeable) and we want the encoding as 'utf'-8 */
/* The WriteableStream has the method write() */
fs.createWriteStream('out.txt', 'utf-8')
.write('hello world');
0
user9258013

Попробуйте следующее:

fs.readFile(`${__dirname}/fileName`, 'utf-8',(err, contents) => {
    if (err) throw Error(err){
        console.log(contents)
    }
});
0
sultan aslam