Вопрос

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

Это было полезно?

Решение

Есть много деталей в 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!");
}); 

Другие советы

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

  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 версии 0.12 (стабильная версия анонсирована 06.02.2015) теперь поддерживаются две функции:cork() и uncork().Похоже, что эти функции, наконец, позволят вам буферизировать / сбрасывать вызовы write.

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

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

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

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.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) Документы.

Мне понравилось Индекс ./статьи/файловая система.

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

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

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

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

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

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

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

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

Вы можете выполнить запись в файл, используя фс модуль (файловой системы).

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

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(оригинал) функция может быть использована.Это позволяет нам переключаться с обратных вызовов на обещания.Взгляните на пример с 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);
}

Здесь мы используем 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.длина'.

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

fs.createWriteStream(path[,options])

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

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

Нравится Поток чтения, если fd указывается, Поток записи будет игнорировать path аргумент и будет использовать указанный файловый дескриптор.Это означает, что нет 'open' событие будет отправлено. fd должно быть блокирующим;неблокирующий fds должны быть переданы сеть.Розетка.

Если 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');

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

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

Вы можете использовать библиотеку 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);
});

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

fs.readFile(`${__dirname}/fileName`, 'utf-8',(err, contents) => {
    if (err) throw Error(err){
        console.log(contents)
    }
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top