it-swarm.com.de

C ist ein schnellerer Weg, um zu prüfen, ob ein Verzeichnis existiert

Ich verwende die Funktion opendir, um zu prüfen, ob ein Verzeichnis existiert. Das Problem ist, dass ich es in einer massiven Schleife verwende und 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?

20

Sie könnten mkdir() aufrufen. Wenn das Verzeichnis nicht existiert, wird es erstellt und 0 wird zurückgegeben. Wenn das Verzeichnis vorhanden ist, wird -1 zurückgegeben und errno auf EEXIST gesetzt.

17
ckruse

Erwägen Sie die Verwendung von stat . S_ISDIR(s.st_mode) sagt Ihnen, 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 */
    }
}
...
41
Johannes Weiss

Ich bevorzuge die Verwendung von access()

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

Wenn Sie sicherstellen, dass im Verzeichnisnamen ein nachstehender / eingegeben wird, funktioniert dies einwandfrei.

16
To1ne

Ich würde stat() verwenden, falls verfügbar.

2
unwind

Es klingt, als hätten Sie ein Gedächtnisleck. Der Aufruf von opendir sollte den RAM Ihrer App nicht aufblähen, solange Sie nicht vergessen, closedir aufzurufen, nachdem ein Verzeichnis erfolgreich geöffnet wurde. Stellen Sie außerdem sicher, dass Sie alle Puffer freigeben, die Sie zur Berechnung des Verzeichnisnamens zugewiesen haben.

0
David Grayson