Das Projekt, an dem ich arbeite (node.js), impliziert viele Operationen mit dem Dateisystem (Kopieren / Lesen / Schreiben usw.). Ich würde gerne wissen, welche Methoden am schnellsten sind, und würde mich über einen Rat freuen. Vielen Dank.
javascript
node.js
Bonbonez
quelle
quelle
Antworten:
Dies ist eine gute Möglichkeit, eine Datei mithilfe von Streams in eine Codezeile zu kopieren:
In Knoten v8.5.0 wurde copyFile hinzugefügt
quelle
createReadStream
als auchcreateWriteStream
auf Fehler überprüfen möchten , damit Sie keinen Einzeiler erhalten (obwohl dies immer noch genauso schnell ist).cp test.log newLog.log
Viarequire('child_process').exec
?copy
ist im Gegensatz zu einer vollständigen Node.js-Lösung unter Windows nicht portierbar.child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
.fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
Gleicher Mechanismus, aber dies fügt eine Fehlerbehandlung hinzu:
quelle
WriteStream
Testament wird es nur entpfeifen. Sie müssten sichrd.destroy()
selbst anrufen . Zumindest ist mir das passiert. Leider gibt es außer dem Quellcode nicht viel Dokumentation.cb
? Was sollen wir als drittes Argument eingeben?Ich konnte die
createReadStream/createWriteStream
Methode aus irgendeinem Grund nicht zumfs-extra
Laufen bringen , aber mit dem npm-Modul funktionierte es sofort. Ich bin mir jedoch nicht sicher über den Leistungsunterschied.fs-extra
npm install --save fs-extra
quelle
fs.copy(src, dst, callback);
diese sollten das Problem von @ mvillar lösen.Seit Node.js 8.5.0 haben wir neue Methoden fs.copyFile und fs.copyFileSync .
Anwendungsbeispiel:
quelle
copyFile()
beim Überschreiben längerer Dateien Fehler auftreten. Mit freundlicher Genehmigung vonuv_fs_copyfile()
till Node v8.7.0 (libuv 1.15.0). siehe github.com/libuv/libuv/pull/1552Schnell zu schreiben und bequem zu bedienen, mit Versprechen und Fehlermanagement.
Gleiches gilt für die asynchrone / warten-Syntax:
quelle
new Promise(function(resolve, reject) { resolve(1); resolve(2); reject(3); reject(4); console.log("DONE"); }).then(console.log.bind(console), function(e){console.log("E", e);});
die Spezifikation dazu getestet und nachgeschlagen, und Sie haben Recht: Der Versuch, ein gelöstes Versprechen zu lösen oder abzulehnen, hat keine Auswirkung. Vielleicht könnten Sie Ihre Antwort erweitern und erklären, warum Sie die Funktion auf diese Weise geschrieben haben? Danke :-)close
solltefinish
für beschreibbare Streams./dev/stdin
wird, ist dies ein Fehler. Github.com/joyent/node/issues/25375Normalerweise ist es gut, asynchrone Dateivorgänge zu vermeiden. Hier ist das kurze Synchronisierungsbeispiel (dh keine Fehlerbehandlung):
quelle
*Sync
Methoden sind völlig gegen die Philosophie von nodejs! Ich denke auch, dass sie langsam veraltet sind. Die ganze Idee von nodejs ist, dass es Single-Threaded und ereignisgesteuert ist.Mike Schillings Lösung mit Fehlerbehandlung mit einer Verknüpfung für den Fehlerereignishandler.
quelle
Wenn Sie sich nicht darum kümmern, dass es asynchron ist, und keine Dateien in Gigabyte-Größe kopieren und lieber keine weitere Abhängigkeit nur für eine einzelne Funktion hinzufügen möchten:
quelle
fs.existsSync
Anruf sollte weggelassen werden. Die Datei könnte in der Zeit zwischen demfs.existsSync
Anruf und demfs.readFileSync
Anruf verschwinden , was bedeutet, dass derfs.existsSync
Anruf uns vor nichts schützt.false
beifs.existsSync
Fehlschlägen wahrscheinlich eine schlechte Ergonomie, da nur wenige VerbrauchercopySync
daran denken, den Rückgabewert bei jedem Aufruf manuell zu überprüfen, genauso wenig wie beifs.writeFileSync
et al. . Das Auslösen einer Ausnahme ist eigentlich vorzuziehen.Dies ist, was ich persönlich benutze, um eine Datei zu kopieren und eine andere Datei mit node.js zu ersetzen :)
quelle
Für schnelle Kopien sollten Sie die
fs.constants.COPYFILE_FICLONE
Flagge verwenden. Es ermöglicht (für Dateisysteme, die dies unterstützen), den Inhalt der Datei nicht tatsächlich zu kopieren. Es wird nur ein neuer Dateieintrag erstellt, der jedoch auf einen Copy-on-Write- "Klon" der Quelldatei verweist .Nichts / weniger zu tun ist der schnellste Weg, etwas zu tun;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
Verwenden Sie stattdessen Versprechen:
quelle
fs.promises.copyFile
Die Lösung von benweet überprüft die Sichtbarkeit der Datei vor dem Kopieren:
quelle
Warum nicht NodeJs verwenden, die in die Kopierfunktion integriert sind?
Es bietet sowohl eine asynchrone als auch eine synchronisierte Version:
https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags
quelle
Mikes Lösung , aber mit Versprechungen:
quelle
Verbesserung einer anderen Antwort.
Eigenschaften:
promise
, was die Verwendung in einem größeren Projekt erleichtert.Verwendungszweck:
Code:
quelle
Alle oben genannten Lösungen, die das Vorhandensein einer Quelldatei nicht überprüfen, sind gefährlich ... z
Andernfalls besteht in einem Szenario das Risiko, dass Ihre Daten dauerhaft verloren gehen, ohne dass ein Fehler bemerkt wird, wenn Quelle und Ziel versehentlich ersetzt werden.
quelle