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ć?
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!");
});
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:
-
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.
-
fs.writeFile(filename, data, [encoding], callback)
Wszystkie dane muszą być przechowywane w tym samym czasie; nie można wykonywać sekwencyjnych zapisów.
-
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.
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();
});
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');
})
});
});
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.
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.
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");
});
}
});
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");
}
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ść".
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()
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);
});
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);
}
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