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

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

1440 голосов
/ 23 марта 2010

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

Ответы [ 17 ]

2198 голосов
/ 23 марта 2010

Есть много деталей в 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!");
}); 
499 голосов
/ 29 апреля 2012

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

  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 ...). Если вы записываете три байта, эти байты будут храниться в буфере (памяти) вместо того, чтобы выполнять вызов ввода-вывода только для трех байтов. Когда буфер заполнен, содержимое сбрасывается и сохраняется на диск. Это улучшает производительность.

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

233 голосов
/ 05 августа 2011

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

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();
});
47 голосов
/ 16 декабря 2013
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');
        })
    });
});
39 голосов
/ 17 мая 2018

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

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>

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

28 голосов
/ 07 ноября 2014

Мне понравилось Индекс ./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);, вы получите место для записи файла.

11 голосов
/ 28 мая 2018

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

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}
7 голосов
/ 23 октября 2016
 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");
                            });
                        }
                });
6 голосов
/ 20 сентября 2018

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

ОК, это довольно просто, поскольку 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!');
});
...