Wie überprüfe ich das Vorhandensein einer Datei ?
In der Dokumentation zum Modul fs
finden Sie eine Beschreibung der Methode fs.exists(path, callback)
. Soweit ich weiß, wird jedoch nur nach Verzeichnissen gesucht. Und ich muss die Datei überprüfen !
Wie kann das gemacht werden?
fs.access('file', err => err ? 'does not exist' : 'exists')
finden fs.accessAntworten:
Warum nicht einfach versuchen, die Datei zu öffnen?
fs.open('YourFile', 'a', function (err, fd) { ... })
Trotzdem versuchen Sie nach einer Minute Suche Folgendes:Beide
path.exists
undfs.exists
sind veraltet*Bearbeiten:
Geändert:
else if(err.code == 'ENOENT')
zu:
else if(err.code === 'ENOENT')
Linter beschwert sich darüber, dass die Doppelgleichheit nicht die Dreifachgleichheit ist.
Verwenden von fs.stat:
quelle
fs.exists
funktioniert es auch. Ich hatte Probleme mit den Berechtigungen für die Datei.path.exists
tatsächlich ist zugunsten vonfs.exists
fs.exists
undfs.existsSync
ist ebenfalls veraltet. Der beste Weg, um das Vorhandensein von Dateien zu überprüfen, istfs.stat
, wie oben gezeigt.fs.existsSync
ist nicht mehr beraubt, obwohl esfs.exists
immer noch ist.Ein einfacher Weg, dies synchron zu tun.
Das API-Dokument beschreibt, wie es
existsSync
funktioniert:Testen Sie, ob der angegebene Pfad vorhanden ist, indem Sie mit dem Dateisystem prüfen.
quelle
fs.existsSync(path)
ist jetzt veraltet, siehe nodejs.org/api/fs.html#fs_fs_existssync_path . Eine synchrone Implementierungfs.statSync(path)
wird empfohlen, siehe meine Antwort.fs.existsSync
wurde veraltet, ist es aber nicht mehr.Bearbeiten: Seit Knoten
v10.0.0
könnten wir verwendenfs.promises.access(...)
Beispiel für einen asynchronen Code, der prüft, ob eine Datei vorhanden ist:
Eine Alternative für stat könnte die Verwendung des neuen sein
fs.access(...)
:minimierte Kurzversprechungsfunktion zur Überprüfung:
Beispielnutzung:
erweiterter Versprechen Weg:
oder wenn du es synchron machen willst:
quelle
fs.constants.F_OK
etc. Ist es auch möglich wie darauf zuzugreifenfs.F_OK
? Seltsam. Auch knapp, was schön ist.fs.promises.access(path, fs.constants.F_OK);
einfach zu einem Versprechen zu machen, anstatt ein Versprechen zu erstellen.fs.exists(path, callback)
undfs.existsSync(path)
sind jetzt veraltet, siehe https://nodejs.org/api/fs.html#fs_fs_exists_path_callback und https://nodejs.org/api/fs.html#fs_fs_existssync_path .Um die Existenz einer Datei synchron zu testen, kann man dh verwenden.
fs.statSync(path)
. Einfs.Stats
Objekt wird zurückgegeben, wenn die Datei vorhanden ist (siehe https://nodejs.org/api/fs.html#fs_class_fs_stats) . Andernfalls wird ein Fehler ausgegeben, der von der try / catch-Anweisung abgefangen wird.quelle
fs
Variable kommtfs.existsSync()
nicht mehr veraltet.Alte Version vor V6: Hier ist die Dokumentation
AKTUALISIEREN
Neue Versionen von V6: Dokumentation für
fs.stat
quelle
fs.exists
undfs.existsSync
sind gemäß dem von Ihnen freigegebenen Link veraltet.existsSync
ist gemäß diesem Dokument nicht veraltet, möglicherweise war es, als Sie es gelesen haben.Moderner asynchroner / wartender Weg (Knoten 12.8.x)
Wir müssen verwenden,
fs.stat() or fs.access()
weilfs.exists(path, callback)
jetzt veraltet istEin weiterer guter Weg ist fs-extra
quelle
fs.exists
ist seit 1.0.0 veraltet. Sie könnenfs.stat
stattdessen verwenden.Hier ist der Link zur Dokumentation fs.stats
quelle
stats.isFile()
braucht nichtfilename
.@ Fox: tolle Antwort! Hier ist eine kleine Erweiterung mit einigen weiteren Optionen. Es ist das, was ich in letzter Zeit als Lösung verwendet habe:
PS: Schauen Sie sich fs-extra an, wenn Sie es noch nicht verwenden - es ist ziemlich süß. https://github.com/jprichardson/node-fs-extra )
quelle
Es gibt viele ungenaue Kommentare darüber,
fs.existsSync()
dass man veraltet ist. es ist nicht.https://nodejs.org/api/fs.html#fs_fs_existssync_path
quelle
async/await
Version mitutil.promisify
ab Knoten 8:quelle
quelle
Nach einigem Experimentieren fand ich das folgende Beispiel
fs.stat
als eine gute Möglichkeit, asynchron zu überprüfen, ob eine Datei vorhanden ist. Es wird auch überprüft, ob Ihre "Datei" "wirklich eine Datei" ist (und kein Verzeichnis).Diese Methode verwendet Versprechen, vorausgesetzt, Sie arbeiten mit einer asynchronen Codebasis:
Wenn die Datei nicht vorhanden ist, wird das Versprechen dennoch aufgelöst
false
. Wenn die Datei vorhanden ist und es sich um ein Verzeichnis handelt, wird sie aufgelösttrue
. Alle Fehler, die versuchen, die Datei zu lesen,reject
versprechen den Fehler selbst.quelle
Nun, ich habe es so gemacht, wie auf https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback zu sehen
Gibt es ein Problem damit?
quelle
In alten Zeiten, bevor ich mich hinsetze, überprüfe ich immer, ob ein Stuhl da ist, dann sitze ich, sonst habe ich einen alternativen Plan wie in einem Bus sitzen. Jetzt schlagen die Website node.js vor, einfach loszulegen (keine Überprüfung erforderlich), und die Antwort sieht folgendermaßen aus:
Code von http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/ aus dem März 2014 entnommen und leicht an den Computer angepasst. Es wird auch nach Berechtigungen gesucht - entfernen Sie die Berechtigung zum Testen
chmod a-r foo.txt
quelle
Rückruf von vannilla Nodejs
Die Dokumente sagen, dass Sie
access()
als Ersatz für veraltete verwenden solltenexists()
Knoten mit eingebautem Versprechen (Knoten 7+)
Beliebtes Javascript-Framework
fs-extra
Wie Sie viel einfacher sehen. Und der Vorteil gegenüber Promisify ist, dass Sie mit diesem Paket vollständige Schreibvorgänge haben (vollständiges Intellisense / Typoskript)! In den meisten Fällen haben Sie diese Bibliothek bereits aufgenommen, da (+ -10.000) andere Bibliotheken davon abhängen.
quelle
Sie können verwenden
fs.stat
, um zu überprüfen, ob das Ziel eine Datei oder ein Verzeichnis ist, und umfs.access
zu überprüfen, ob Sie die Datei schreiben / lesen / ausführen können. (Denken Sie daran, zu verwendenpath.resolve
, den vollständigen Pfad für das Ziel zu verwenden.)Dokumentation:
Vollständiges Beispiel (TypeScript)
quelle
Für asynchrone Version! Und mit der Versprechensversion! Hier der saubere einfache Weg!
Ein praktischerer Ausschnitt aus meinem Code zur besseren Veranschaulichung:
Das obige Beispiel dient nur zur Demonstration! Ich hätte das Fehlerereignis des Lesestreams verwenden können! Fehler abfangen! Und überspringen Sie die beiden Anrufe!
quelle