C schnellere Möglichkeit zu prüfen, ob ein Verzeichnis existiert

Lesezeit: 4 Minuten

Benutzer-Avatar
Frederico Schardong

Ich verwende die opendir-Funktion, um zu prüfen, ob ein Verzeichnis vorhanden ist. Das Problem ist, dass ich es in einer massiven Schleife verwende und es den von meiner App verwendeten RAM aufbläst.

Was ist der beste (schnellste) Weg, um zu überprüfen, ob ein Verzeichnis in C existiert? Was ist der beste (schnellste) Weg, um es zu erstellen, wenn es nicht existiert?

  • Dumme Frage, rufst du an? closedir() danach?

    – Benutzer7116

    16. Februar 2012 um 16:04 Uhr

  • Und der schnellere Weg könnte sein, dies asynchron zu tun, aber Sie sollten die Fähigkeiten Ihrer Medien berücksichtigen. Wenn es sich um eine normale Festplatte handelt, kann es zu einem Suchsturm kommen, und dies wird langsam funktionieren. Aber wenn Sie RAID/SSD verwenden oder sogar in der Cloud arbeiten, wird dies funktionieren.

    – LiMar

    16. Februar 2012 um 16:09 Uhr

Erwägen Sie die Verwendung stat. S_ISDIR(s.st_mode) wird Ihnen sagen, ob es sich um ein Verzeichnis handelt.

Probe:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

...
struct stat s;
int err = stat("/path/to/possible_dir", &s);
if(-1 == err) {
    if(ENOENT == errno) {
        /* does not exist */
    } else {
        perror("stat");
        exit(1);
    }
} else {
    if(S_ISDIR(s.st_mode)) {
        /* it's a dir */
    } else {
        /* exists but is no dir */
    }
}
...

  • Wie schneller ist es im Vergleich zu opendir?

    – Frederico Schardong

    16. Februar 2012 um 16:22 Uhr

  • Das hängt vom Betriebssystem und der Anzahl der Einträge im übergeordneten Verzeichnis ab. Es wird auf jeden Fall schneller und das ist was stat ist dafür gemacht.

    – Johannes Weiss

    16. Februar 2012 um 16:24 Uhr

  • Wäre lstat auch eine Option?

    – cwd

    8. Juni 2013 um 22:09 Uhr

  • @cwd, ja, denke ich lstat wäre möglicherweise die noch bessere Option, da es keinen Symlinks folgt. Hängt aber davon ab, was gewollt ist…

    – Johannes Weiss

    8. Juni 2013 um 22:32 Uhr

  • Ich verwende dies, um auf “D:\path\subpath” zu testen, und ich habe das Verzeichnis erstellt. Es sagt mir, dass dir das tut nicht existieren. :/ (mit Windows/MinGW)

    – IAbstract

    30. März 2015 um 13:22 Uhr


Benutzer-Avatar
ckruse

Du könntest anrufen mkdir(). Wenn das Verzeichnis nicht existiert, wird es erstellt und 0 Wird zurückgegeben. Wenn das Verzeichnis dann existiert -1 wird zurückgegeben und errno wird eingestellt EEXIST.

  • Mit dem Vorbehalt, dass ENOENT kann auftreten, wenn etwas entlang des Pfades nicht vorhanden ist.

    – Benutzer7116

    16. Februar 2012 um 16:07 Uhr

  • WAHR. Hätte das erwähnen sollen.

    – ckruse

    16. Februar 2012 um 16:08 Uhr

  • Da Sie das Verzeichnis erstellen möchten, wenn es nicht existiert: ja. Sie sparen ein stat() Anruf.

    – ckruse

    16. Februar 2012 um 20:53 Uhr

  • Beachten Sie, dass Sie (z mkdir) und (zur Handhabung errno und EEXIST).

    – Skippy le Grand Gourou

    21. Juli 2013 um 18:09 Uhr

  • Beachten Sie jedoch, dass, wenn Sie das Verzeichnis NICHT erstellen MÖCHTEN (sondern nur nach der ersten Hälfte der Frage auf Existenz prüfen), dann mkdir kostet Sie I/O (könnte synchronisiert werden, was einen noch größeren Einbruch der I/O-Leistung für andere Akteure auf dem System kostet) und kann aus Gründen fehlschlagen, die nichts mit der Existenz zu tun haben, wie z. B. Berechtigungen des aktuellen Kontos, Mount-Optionen (R/O FS), oder verfügbarer Speicherplatz oder Quota im Dateisystem.

    – Jim Klimow

    21. Juli 2020 um 9:15 Uhr

Ich benutze lieber access()

if (0 != access("/path/to/possible_dir/", F_OK)) {
  if (ENOENT == errno) {
     // does not exist
  }
  if (ENOTDIR == errno) {
     // not a directory
  }
}

Wenn Sie einen Nachlauf gewährleisten / im Verzeichnisnamen funktioniert das einwandfrei.

  • Können Sie mir zeigen, wo Sie das Bit mit dem abschließenden Schrägstrich gefunden haben? Das access() Manpage scheint nichts darüber zu sagen.

    – Domson

    23. November 2018 um 8:21 Uhr

  • Das ist die beste Referenz, die ich finden konnte: pubs.opengroup.org/onlinepubs/009695399/basedefs/…

    – To1ne

    26. November 2018 um 9:16 Uhr

ich würde … benutzen stat()wenn verfügbar.

Es hört sich an, als hättest du ein Speicherleck. Das Aufrufen von opendir sollte den Arbeitsspeicher Ihrer App nicht aufblähen, solange Sie daran denken, nach dem erfolgreichen Öffnen eines Verzeichnisses immer closedir aufzurufen. Stellen Sie außerdem sicher, dass Sie alle Puffer freigeben, die Sie zur Berechnung des Verzeichnisnamens zugewiesen haben.

  • Ja, ich schließe es, ich benutze nur stat, danke für deine Zeit!

    – Frederico Schardong

    16. Februar 2012 um 16:28 Uhr

  • Ja, ich schließe es, ich benutze nur stat, danke für deine Zeit!

    – Frederico Schardong

    16. Februar 2012 um 16:28 Uhr

1345020cookie-checkC schnellere Möglichkeit zu prüfen, ob ein Verzeichnis existiert

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

Privacy policy