Zapisywanie plików w węźle.js

Próbowałem znaleźć sposób, aby zapisać do pliku podczas korzystania z węzła.js, ale bez powodzenia. Jak mogę to zrobić?

Author: KARTHIKEYAN.A, 2010-03-23

12 answers

Istnieje wiele szczegółów w API systemu plików . Najczęstszym sposobem (o ile wiem) jest:

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

    console.log("The file was saved!");
}); 
 1888
Author: Brian McKenna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-27 12:35:29

Obecnie istnieją trzy sposoby zapisu pliku:

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

    Musisz poczekać na wywołanie zwrotne, aby upewnić się, że bufor jest zapisany na dysk. Nie jest buforowana.

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

    Wszystkie dane muszą być przechowywane w tym samym czasie; nie można wykonywać sekwencyjnych zapisów.

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

    Tworzy WriteStream, co jest wygodne, ponieważ nie trzeba czekać na / align = "left" / Ale znowu, nie jest buforowany.

A WriteStream, Jak sama nazwa mówi, to strumień. Strumień z definicji jest "buforem" zawierającym dane, które poruszają się w jednym kierunku (źródło ► cel). Ale zapisywalny strumień niekoniecznie jest "buforowany". Strumień jest "buforowany", gdy piszesz n razy, a w czasie n+1, strumień wysyła bufor do jądra (ponieważ jest pełny i musi zostać spłukany).

Innymi słowy: "bufor" jest obiekt. To, czy "jest buforowane" jest własnością tego obiektu.

Jeśli spojrzysz na kod, WriteStream dziedziczy z zapisywalnego Stream obiektu. Jeśli zwrócisz uwagę, zobaczysz, jak spłukują zawartość; nie mają żadnego systemu buforowania.

Jeśli napiszesz łańcuch znaków, zostanie on skonwertowany do bufora, a następnie wysłany do warstwy macierzystej i zapisany na dysk. Podczas pisania ciągów nie wypełniają żadnego bufora. Więc jeśli tak:

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

Jesteś robi:

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

To trzy wywołania warstwy wejścia / Wyjścia. Chociaż używasz "buforów", dane nie są buforowane. Buforowany strumień wykonałby: fs.write(new Buffer ("abc")), jedno wywołanie warstwy We/Wy.

Od teraz w Node.js v0 .12 (wersja stabilna zapowiedziana 02.06.2015) obsługuje teraz dwie funkcje: cork() oraz uncork(). Wygląda na to, że te funkcje w końcu pozwolą Ci buforować / spłukiwać wywołania zapisu.

Na przykład w Javie są pewne klasy, które zapewnij buforowane strumienie (BufferedOutputStream, BufferedWriter...). Jeśli napiszesz trzy bajty, te bajty będą przechowywane w buforze (pamięci) zamiast wykonywać wywołanie we/wy tylko przez trzy bajty. Gdy bufor jest pełny, zawartość jest spłukiwana i zapisywana na dysku. Poprawia to wydajność.

Niczego nie odkrywam, tylko przypominam sobie, jak powinien być zrobiony dostęp do dysku.

 448
Author: Gabriel Llamas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-22 21:41:46

Możesz oczywiście uczynić go trochę bardziej zaawansowanym. Nieblokowanie, zapisywanie bitów i fragmentów, nie zapisywanie całego pliku naraz:

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();
});
 202
Author: Fredrik Andersson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 17:58:37
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');
        })
    });
});
 40
Author: Mister P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 09:14:21

I liked Index of ./ articles/file-system.

U mnie zadziałało. [[3]}Zobacz Jak zapisywać pliki w 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');
});
Zawartość helloworld.txt:
Hello World!

Aktualizacja:
Podobnie jak w Linuksie node write w bieżącym katalogu, wydaje się, że w niektórych innych nie, więc dodaję ten komentarz na wszelki wypadek: {]} Używając tego ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH);, aby dowiedzieć się, gdzie plik jest zapisany.

 22
Author: Sérgio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 16:11:45

Zapis Synchroniczny

Fs.writeFileSync (plik, DANE[, opcje])

fs = require('fs');

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

Zapis Asynchroniczny

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

Gdzie

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

Warto przeczytać oficjalny system plików (fs) docs.

 8
Author: Moriarty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 05:54:00
 var fs = require('fs');
 fs.writeFile(path + "\\message.txt", "Hello", function(err){
 if (err) throw err;
  console.log("success");
}); 

Na przykład : odczyt pliku i zapis do innego pliku:

  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
Author: Masoud Siahkali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-23 07:54:56

Znam pytanie o "write", ale w ogólniejszym znaczeniu "append" może być przydatne w niektórych przypadkach, ponieważ jest łatwy w użyciu w pętli, aby dodać tekst do pliku (czy plik istnieje, czy nie). Użyj "\N " jeśli chcesz dodać linie np:

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}
 4
Author: Astra Bear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-28 01:55:32

Tutaj używamy w+ do odczytu/zapisu obu akcji i jeśli ścieżka do pliku nie zostanie znaleziona, zostanie utworzona automatycznie.

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 oznacza to, co musisz zapisać do pliku i jego długość, ' content.długość".

 3
Author: Gunjan Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 18:03:59

Oto przykład jak odczytać plik csv z lokalnego i zapisać plik csv do lokalnego.

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
Author: KARTHIKEYAN.A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 11:06:53

Możesz użyć biblioteki easy-file-manager

Install first from npm npm install easy-file-manager

Przykład do przesyłania i usuwania plików

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
Author: Christoper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 05:15:42

Możesz zapisać do pliku używając modułu fs (system plików).

Oto przykład jak możesz to zrobić:

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

Możesz również pozbyć się tej struktury kodu zwrotnego wewnątrz wywołania zwrotnego, używając obietnic i async/await Oświadczenia. Spowoduje to, że asynchroniczna struktura kodu będzie znacznie bardziej płaska. Do tego jest przydatny util.można użyć funkcji promisify(original). Pozwala nam przełączyć się z wywołań zwrotnych na obietnice. Spójrz na przykład z fs funkcji poniżej:

// 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);
}
 0
Author: Oleksii Trekhleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 10:36:39