C schnellere Möglichkeit zu prüfen, ob ein Verzeichnis existiert
Lesezeit: 4 Minuten
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
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.
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
13450200cookie-checkC schnellere Möglichkeit zu prüfen, ob ein Verzeichnis existiertyes
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