Schreiben in Dateien in Node.js

Lesezeit: 8 Minuten

Schreiben in Dateien in Nodejs
Gjorgji

Ich habe versucht, einen Weg zu finden, in eine Datei zu schreiben, wenn ich Node.js verwende, aber ohne Erfolg. Wie kann ich das machen?

Schreiben in Dateien in Nodejs
Brian McKenna

Es gibt viele Details in der Dateisystem-API. Der gebräuchlichste Weg ist:

const fs = require('fs');

fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        return console.log(err);
    }
    console.log("The file was saved!");
}); 

// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');

  • Ich habe dieses Skript mit Node getestet und versucht, den Dateipfad in „/home/“ zu ändern, aber ich habe die folgende Fehlermeldung erhalten: { [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' } Wie kann ich dieses Skript so ändern, dass es außerhalb von funktioniert /tmp?

    – Anderson Green

    10. September 2012 um 20:37 Uhr


  • Beachten Sie auch, dass Sie fs.writeFileSync(…) verwenden können, um dasselbe synchron zu erreichen.

    – David Erwin

    23. Januar 2013 um 18:28 Uhr

  • Vielleicht ist es ein bisschen alt, aber @AndersonGreen, Sie müssen node als root oder chmod /home richtig ausführen, um R/W-Berechtigungen für den aktuellen Besitzer des Knotenprozesses (Ihr Benutzername hart) zuzulassen, damit Sie die Datei schreiben können

    – Bestreitet Vitali

    2. Januar 2014 um 23:34 Uhr

  • Eigentlich, @DenysVitali, ist das Problem, dass Jane keine Dateien schreiben können sollte /home/.... Im Allgemeinen ist dieses Verzeichnis 755 root:wheel (oder was auch immer). Wenn der Knoten eine Datei als jane schreiben möchte, ist es einfacher, in sie zu schreiben /home/jane/test.txt. Ändern /home etwas Freizügigeres als 755 zu verwenden, ist ein großer Fehler.

    – jane arc

    26. Januar 2014 um 23:05 Uhr

  • @JaneAvriette Naja, da wollte er die Datei weiter speichern /home Verzeichnis schlug ich vor, es zu chmod. Ich weiß, dass es ein Sicherheitsproblem erzeugen könnte. Aber gut, wenn der Benutzer dort speichern möchte, ist das die Lösung. PS: Ich stimme deiner Aussage zu (:

    – Bestreitet Vitali

    29. Januar 2014 um 22:51 Uhr

Derzeit gibt es drei Möglichkeiten, eine Datei zu schreiben:

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

    Sie müssen auf den Rückruf warten, um sicherzustellen, dass der Puffer auf die Festplatte geschrieben wird. Es ist nicht gepuffert.

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

    Alle Daten müssen gleichzeitig gespeichert werden; Sie können keine sequenziellen Schreibvorgänge ausführen.

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

    Erstellt ein WriteStream, was praktisch ist, da Sie nicht auf einen Rückruf warten müssen. Aber noch einmal, es ist nicht gepuffert.

EIN WriteStream, wie der Name schon sagt, ist ein Stream. Ein Stream ist per Definition „ein Puffer“, der Daten enthält, die sich in eine Richtung bewegen (Quelle ► Ziel). Aber ein beschreibbarer Stream ist nicht unbedingt „gepuffert“. Ein Stream wird beim Schreiben „gepuffert“. n Zeiten und zur Zeit n+1sendet der Stream den Puffer an den Kernel (weil er voll ist und geleert werden muss).

Mit anderen Worten: „Ein Puffer“ ist das Objekt. Ob es „gepuffert“ ist oder nicht, ist eine Eigenschaft dieses Objekts.

Wenn Sie sich den Code ansehen, wird die WriteStream erbt von einem beschreibbaren Stream Objekt. Wenn Sie darauf achten, werden Sie sehen, wie sie den Inhalt spülen; Sie haben kein Puffersystem.

Wenn Sie eine Zeichenfolge schreiben, wird sie in einen Puffer konvertiert und dann an die native Schicht gesendet und auf die Festplatte geschrieben. Beim Schreiben von Strings füllen sie keinen Puffer auf. Also, wenn Sie dies tun:

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

Sie gehen:

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

Das ist drei Aufrufe an die E/A-Schicht. Obwohl Sie „Puffer“ verwenden, werden die Daten nicht gepuffert. Ein gepufferter Stream würde Folgendes tun: fs.write(new Buffer ("abc"))ein Aufruf an die E/A-Schicht.

Ab sofort unterstützt Node.js v0.12 (stabile Version angekündigt am 06.02.2015) nun zwei Funktionen:
cork() und
uncork(). Es scheint, dass diese Funktionen es Ihnen endlich ermöglichen, die Schreibaufrufe zu puffern/leeren.

Beispielsweise gibt es in Java einige Klassen, die gepufferte Streams bereitstellen (BufferedOutputStream, BufferedWriter…). Wenn Sie drei Bytes schreiben, werden diese Bytes im Puffer (Speicher) gespeichert, anstatt einen E/A-Aufruf nur für drei Bytes durchzuführen. Wenn der Puffer voll ist, wird der Inhalt geleert und auf der Festplatte gespeichert. Dies verbessert die Leistung.

Ich entdecke nichts, erinnere mich nur daran, wie ein Festplattenzugriff erfolgen sollte.

  • +1 – schöne Erklärung. Für Write Stream ist es wichtig, die Dokumentation sorgfältig zu lesen. Wenn „false“ oder „closing“ zurückgegeben wird, ist es wichtig, „writer.once(‘drain‘, function(){})“ aufzurufen, oder ich habe Zeilen übersehen, die am Ende des Prozesses nicht abgelaufen waren.

    – Bryanmac

    19. Juni 2014 um 15:18 Uhr

  • Jede Chance, dass Sie ein Beispiel für die Verwendung geben könnten cork() und uncork() für diejenigen von uns, die den Knoten der Vorabversion 0.11 ausprobieren möchten?

    – Professormeowingtons

    16. August 2014 um 7:05 Uhr

  • Ab sofort ist Node v0.12 stabil.

    – Aug

    1. April 2015 um 5:41 Uhr

  • Laut einer Analyse des Codes von GitHub scheint fs.writeFile die beliebteste der von Ihnen erwähnten Funktionen zu sein. Hier sind Beispiele aus der Praxis für die Verwendung von fs.writeFile

    – drorw

    18. April 2019 um 20:11 Uhr

  • Gibt es Bibliotheken in Produktionsqualität? npm Implementieren von gepuffertem Schreiben?

    – nponeccop

    12. Mai 2019 um 18:48 Uhr

1647280509 2 Schreiben in Dateien in Nodejs
Fredrik Andersson

Sie können es natürlich etwas fortgeschrittener machen. Nicht blockieren, Bits und Stücke schreiben, nicht die ganze Datei auf einmal schreiben:

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

  • Was ist die ‘fd’-Variable, die an den Callback für stream.once übergeben wird?

    – Scott Tesler

    18. Oktober 2012 um 5:49 Uhr

  • @ScottDavidTesler-Dateideskriptor, damit Sie den Stream schließen können, nachdem Sie damit fertig sind.

    – Alexey Kamenskiy

    20. November 2012 um 11:32 Uhr

  • Wann schließe ich den Stream? Warum ist das nicht blockierend? Nur neugierig, ich versuche, in eine Protokolldatei zu schreiben.

    – MetaGuru

    3. Januar 2013 um 3:06 Uhr

  • Ich bin mir nicht sicher, ob, wenn der Stream gespült wird. Meine Vermutung ist, dass es eine Möglichkeit gibt, den Stream bei Bedarf zu spülen.

    – Fredrik Andersson

    24. April 2013 um 9:38 Uhr

  • @JoLiss Du musst darauf warten.

    – Fredrik Andersson

    12. November 2014 um 15:37 Uhr

Schreiben in Dateien in Nodejs
Moriarty

Synchrones Schreiben

fs.writeFileSync (Datei, Daten[, options])

fs = require('fs');

fs.writeFileSync("foo.txt", "bar");

Asynchrones Schreiben

fs.writeFile (Datei, Daten[, options]Rückrufen)

fs = require('fs');

fs.writeFile('foo.txt', 'bar', (err) => { if (err) throw err; });

Woher

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

Lesenswert das offizielle Dateisystem (fs) Dokumente.

Update: asynchron/warten

fs = require('fs');
util = require('util');
writeFile = util.promisify(fs.writeFile);

fn = async () => { await writeFile('foo.txt', 'bar'); }

fn()

1647280510 210 Schreiben in Dateien in Nodejs
Herr P

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

  • Dies zeigt, wie eine Datei mit fs-Operationen auf niedrigerer Ebene geschrieben wird. Beispielsweise können Sie garantieren, wann die Datei das Schreiben auf die Festplatte abgeschlossen hat und Dateideskriptoren freigegeben hat.

    – Sean Glover

    18. Januar 2015 um 17:30 Uhr

  • Da in diesem Beispiel der Offset auf ‘0’ gesetzt ist (= dritter Parameter von fs.write()) funktioniert dieses Beispiel nur, wenn alles kurz genug ist, um in einem einzigen Schreibaufruf geschrieben zu werden.

    – Manfred

    9. Februar 2020 um 20:14 Uhr

1647280510 968 Schreiben in Dateien in Nodejs
Bogenschütze Han

Die bereitgestellten Antworten sind veraltet und eine neuere Möglichkeit, dies zu tun, ist:

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

siehe Dokumente hier für weitere Informationen

  • Dies zeigt, wie eine Datei mit fs-Operationen auf niedrigerer Ebene geschrieben wird. Beispielsweise können Sie garantieren, wann die Datei das Schreiben auf die Festplatte abgeschlossen hat und Dateideskriptoren freigegeben hat.

    – Sean Glover

    18. Januar 2015 um 17:30 Uhr

  • Da in diesem Beispiel der Offset auf ‘0’ gesetzt ist (= dritter Parameter von fs.write()) funktioniert dieses Beispiel nur, wenn alles kurz genug ist, um in einem einzigen Schreibaufruf geschrieben zu werden.

    – Manfred

    9. Februar 2020 um 20:14 Uhr

ich mochte Index von ./articles/file-system.

Es hat für mich funktioniert.

Siehe auch Wie schreibe ich Dateien in 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');
});

Inhalt von helloworld.txt:

Hello World!

Aktualisieren:
Wie in Linux node write in current directory scheint es in einigen anderen nicht der Fall zu sein, also füge ich diesen Kommentar nur für den Fall hinzu:
Mit diesem ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH); um dorthin zu gelangen, wo die Datei geschrieben wird.

  • Wo finde ich die Datei helloworld.txt ? Ich kann es in keinem Ordner finden … danke.

    – Kai Feng Chew

    19. Dezember 2014 um 6:58 Uhr

  • in dem Ordner, in dem Sie das Skript ausführen

    – Sergio

    19. Dezember 2014 um 17:22 Uhr

  • Das ist seltsam … Ich kann es nur nirgendwo finden. Wird es versteckt? Nochmals vielen Dank ~

    – Kai Feng Chew

    19. Dezember 2014 um 21:51 Uhr

  • Ich habe es gerade gefunden. Mit diesem ROOT_APP_PATH = fs.realpathSync(‘.’); Konsole.log (ROOT_APP_PATH); um meine zu bekommen, wo die Datei geschrieben wurde. Danke.

    – Kai Feng Chew

    22. Dezember 2014 um 6:21 Uhr

  • @Sérgio: Müssen wir Writefile schließen? Ich rufe einen anderen Prozess auf und erhalte eine Fehlermeldung bezüglich der Datei, die von einem anderen Prozess verwendet wird.

    – Emir

    19. Dezember 2018 um 16:49 Uhr

1002600cookie-checkSchreiben in Dateien in Node.js

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy