Frage Überprüfen Sie synchron, ob Datei / Verzeichnis in Node.js vorhanden ist


Wie kann ich synchron prüfen, verwenden? node.js, wenn eine Datei oder ein Verzeichnis existiert?


825
2017-12-19 11:19


Ursprung


Antworten:


Die Antwort auf diese Frage hat sich im Laufe der Jahre geändert. Das Strom Die Antwort ist hier oben, gefolgt von den verschiedenen Antworten im Laufe der Jahre in chronologischer Reihenfolge:

Aktuelle Antwort

Sie können verwenden fs.existsSync():

var fs = require('fs');
if (fs.existsSync(path)) {
    // Do something
}

Es war für mehrere Jahre veraltet, aber nicht mehr. Aus den Dokumenten:

Beachten Sie, dass fs.exists() ist veraltet, aber fs.existsSync() ist nicht. (Das   Rückrufparameter zu fs.exists() akzeptiert Parameter, die sind   inkonsistent mit anderen Node.js Callbacks. fs.existsSync() nicht   Verwenden Sie einen Rückruf.)

Sie haben ausdrücklich nach einem gefragt synchron Überprüfen Sie, aber wenn Sie eine verwenden können asynchron überprüfen Sie stattdessen (normalerweise am besten mit I / O), verwenden Sie fs.access (schon seit exists ist veraltet).


Historische Antworten

Hier sind die historischen Antworten in chronologischer Reihenfolge:

  • Ursprüngliche Antwort von 2010
    (stat/statSync oder lstat/lstatSync)
  • Aktualisierung September 2012
    (exists/existsSync)
  • Aktualisierung Februar 2015
    (Notiert drohende Abwertung von exists/existsSyncAlso sind wir wahrscheinlich wieder da stat/statSync oder lstat/lstatSync)
  • Aktualisierung Dezember 2015
    (Es gibt auch fs.access(path, fs.F_OK, function(){}) / fs.accessSync(path, fs.F_OK)Beachten Sie jedoch, dass es sich um einen Fehler handelt, wenn die Datei / das Verzeichnis nicht existiert. Dokumente für fs.stat empfehlen zu verwenden fs.access wenn Sie auf Existenz prüfen müssen, ohne zu öffnen)
  • Update Dezember 2016
    fs.exists() ist immer noch veraltet, aber fs.existsSync() ist nicht mehr veraltet. So können Sie es jetzt sicher verwenden.

Ursprüngliche Antwort von 2010:

Sie können verwenden statSync oder lstatSync (Dokumentverknüpfung), die dir einen geben fs.Stats Objekt. Wenn eine synchrone Version einer Funktion verfügbar ist, hat sie im Allgemeinen denselben Namen wie die asynchrone Version mit Sync Am Ende. Damit statSync ist die synchrone Version von stat; lstatSync ist die synchrone Version von lstat, etc.

lstatSync sagt Ihnen, ob etwas existiert und wenn ja, ob es eine Datei oder ein Verzeichnis ist (oder in einigen Dateisystemen, eine symbolische Verbindung, ein Blockgerät, ein Zeichengerät usw.), z.B. wenn Sie wissen müssen, ob es existiert und ein Verzeichnis ist:

var fs = require('fs');
try {
    // Query the entry
    stats = fs.lstatSync('/the/path');

    // Is it a directory?
    if (stats.isDirectory()) {
        // Yes it is
    }
}
catch (e) {
    // ...
}

... und ähnlich, wenn es eine Datei ist, gibt es isFile; Wenn es ein Block-Gerät ist, gibt es isBlockDevice, usw., usw. Beachten Sie die try/catch; Es wird ein Fehler ausgegeben, wenn der Eintrag überhaupt nicht existiert.

Wenn es dir egal ist, was der Eintrag ist ist und nur wissen wollen ob es existiert, du kannst es benutzen path.existsSync (oder mit fs.existsSync) wie notiert von user618408:

var path = require('path');
if (path.existsSync("/the/path")) { // or fs.existsSync
    // ...
}

Es erfordert kein try/catch, aber gibt dir keine Informationen darüber, was das Ding ist, nur dass es da ist.


1613
2017-12-19 11:26



Beim Betrachten der Quelle gibt es eine synchrone Version von path.exists - path.existsSync. Sieht so aus, als ob es in den Dokumenten verpasst wurde.

Aktualisieren:

path.exists und path.existsSync sind jetzt veraltet. Benutzen Sie bitte fs.exists und fs.existsSync.

Update 2016:

fs.exists und fs.existsSync haben auch veraltet sein. Benutzen fs.stat () oder fs.access ()stattdessen.


114
2018-02-15 19:05



Unter Verwendung der aktuell empfohlenen (ab 2015) APIs (pro Node-Dokumentation) mache ich Folgendes:

var fs = require('fs');

function fileExists(filePath)
{
    try
    {
        return fs.statSync(filePath).isFile();
    }
    catch (err)
    {
        return false;
    }
}

Als Antwort auf das EPERM-Problem, das @broadband in den Kommentaren angesprochen hat, bringt das einen guten Punkt. fileExists () ist wahrscheinlich in vielen Fällen keine gute Möglichkeit, darüber nachzudenken, da fileExists () eine boolesche Rückgabe nicht wirklich versprechen kann. Möglicherweise können Sie endgültig feststellen, dass die Datei existiert oder nicht existiert, aber Sie erhalten möglicherweise auch einen Berechtigungsfehler. Der Berechtigungsfehler bedeutet nicht unbedingt, dass die Datei vorhanden ist, da Sie möglicherweise keine Berechtigung für das Verzeichnis mit der Datei haben, die Sie überprüfen. Und natürlich besteht die Möglichkeit, dass Sie einen anderen Fehler beim Überprüfen der Dateiexistenz feststellen könnten.

Also ist mein Code oben wirklich doesFileExistAndDoIHaveAccessToIt (), aber Ihre Frage könnte dossFileNotExistAndCouldICreateIt () sein, was eine völlig andere Logik wäre (die unter anderem einen EPERM-Fehler berücksichtigen müsste).

Während die fs.existsSync-Antwort die Frage direkt beantwortet, wird das oft nicht das sein, was Sie wollen (Sie wollen nicht nur wissen, ob "etwas" auf einem Pfad existiert, Sie interessieren sich wahrscheinlich dafür, ob das "Ding" das existiert ist eine Datei oder ein Verzeichnis).

Die Quintessenz ist, dass wenn Sie überprüfen, ob eine Datei vorhanden ist, Sie wahrscheinlich das tun, weil Sie beabsichtigen, basierend auf dem Ergebnis eine Aktion auszuführen, und diese Logik (die Überprüfung und / oder die nachfolgende Aktion) sollte der Idee entsprechen dass eine Sache, die an diesem Pfad gefunden wird, eine Datei oder ein Verzeichnis sein kann und dass EPERM oder andere Fehler bei der Überprüfung auftreten können.


50
2017-09-23 21:12



Ein weiteres Update

Ich brauche selbst eine Antwort auf diese Frage. Ich habe die Node-Dokumente nachgeschlagen nicht Verwenden Sie fs.exists, verwenden Sie stattdessen fs.open und verwenden Sie den ausgegebenen Fehler, um festzustellen, ob eine Datei nicht existiert:

aus der Dokumentation:

fs.exists () ist ein Anachronismus und existiert nur aus historischen Gründen.   Es sollte fast nie einen Grund geben, es in Ihrem eigenen Code zu verwenden.

Insbesondere wird vor dem Öffnen geprüft, ob eine Datei existiert   Anti-Pattern, das Sie anfällig für Race-Bedingungen macht: ein anderes   Prozess kann die Datei zwischen den Aufrufen von fs.exists () und entfernen   fs.open (). Öffnen Sie einfach die Datei und behandeln Sie den Fehler, wenn dies nicht der Fall ist   Dort.

http://nodejs.org/api/fs.html#fs_fs_exists_path_callback


19
2018-06-07 04:13



Ich benutze unten Funktion, um zu testen, ob die Datei existiert. Es fängt auch andere Ausnahmen. Also, wenn es Rechte gibt, z.B. chmod ugo-rwx filename oder in Windows Right Click -> Properties -> Security -> Advanced -> Permission entries: empty list .. Die Funktion gibt die Ausnahme so zurück, wie sie sollte. Die Datei existiert, aber wir haben keine Zugriffsrechte. Es wäre falsch, diese Art von Ausnahmen zu ignorieren.

function fileExists(path) {

  try  {
    return fs.statSync(path).isFile();
  }
  catch (e) {

    if (e.code == 'ENOENT') { // no such file or directory. File really does not exist
      console.log("File does not exist.");
      return false;
    }

    console.log("Exception fs.statSync (" + path + "): " + e);
    throw e; // something else went wrong, we don't have rights, ...
  }
}

Ausnahmeausgabe, nodejs Fehler Dokumentation falls die Datei nicht existiert:

{
  [Error: ENOENT: no such file or directory, stat 'X:\\delsdfsdf.txt']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'stat',
  path: 'X:\\delsdfsdf.txt'
}

Ausnahme falls wir keine Rechte an der Datei haben, aber existiert:

{
  [Error: EPERM: operation not permitted, stat 'X:\file.txt']
  errno: -4048,
  code: 'EPERM',
  syscall: 'stat',
  path: 'X:\\file.txt'
}

10
2018-01-26 14:37



fs.exists () ist veraltet, benutze es nicht https://nodejs.org/api/fs.html#fs_fs_exists_path_callback

Sie könnten den Core-Nodejs-Weg wie folgt implementieren: https://github.com/nodejs/node-v0.x-archive/blob/master/lib/module.js#L86

function statPath(path) {
  try {
    return fs.statSync(path);
  } catch (ex) {}
  return false;
}

Dies wird das stats-Objekt zurückgeben, sobald du das stats-Objekt hast, das du ausprobieren kannst

var exist = statPath('/path/to/your/file.js');
if(exist && exist.isFile()) {
  // do something
}

4
2017-07-28 06:53



Einige Antworten sagen das fs.exists und fs.existsSync sind beide veraltet. Laut den Unterlagen ist dies nicht mehr wahr. Nur fs.exists wird nun abgewertet:

Beachten Sie, dass fs.exists () veraltet ist, aber fs.existsSync () nicht. (Das   Callback-Parameter zu fs.exists () akzeptiert Parameter, die   inkonsistent mit anderen Node.js Callbacks. fs.existsSync () nicht   Verwenden Sie einen Rückruf.)

So können Sie sicher verwenden fs.existsSync () synchron prüfen, ob eine Datei existiert.


4
2017-12-04 09:02



Das path Modul bietet keine synchrone Version von path.exists also musst du mit dem herumspielen fs Modul.

Das Schnellste, was ich mir vorstellen kann, ist die Verwendung fs.realpathSync Das wird einen Fehler verursachen, den Sie fangen müssen, also müssen Sie Ihre eigene Wrapper-Funktion mit einem try / catch erstellen.


2
2017-12-19 11:32