Wie kann ich überprüfen, ob ein Verzeichnis unter Linux in C vorhanden ist?
Wie kann ich überprüfen, ob ein Verzeichnis existiert?
Benutzer1543915
hmjd
Sie können verwenden opendir()
und prüfen ob ENOENT == errno
bei Ausfall:
#include <dirent.h>
#include <errno.h>
DIR* dir = opendir("mydir");
if (dir) {
/* Directory exists. */
closedir(dir);
} else if (ENOENT == errno) {
/* Directory does not exist. */
} else {
/* opendir() failed for some other reason. */
}
-
Wenn der Ordner nicht existiert, wie kann ich dann sofort einen erstellen, nachdem ich bestätigt habe, dass er nicht existiert?
– Kartoffel
20. April 2017 um 18:15 Uhr
-
Falls Sie Visual Studio verwenden,
dirent.h
nicht verfügbar ist, siehe diesen SO-Beitrag für Alternativen– gezzakopf
9. April 2018 um 8:49 Uhr
Saman
Verwenden Sie den folgenden Code, um zu überprüfen, ob ein Ordner vorhanden ist. Es funktioniert sowohl auf Windows- als auch auf Linux-Plattformen.
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char* argv[])
{
const char* folder;
//folder = "C:\\Users\\SaMaN\\Desktop\\Ppln";
folder = "/tmp";
struct stat sb;
if (stat(folder, &sb) == 0 && S_ISDIR(sb.st_mode)) {
printf("YES\n");
} else {
printf("NO\n");
}
}
-
Sind Sie sicher, dass die enthaltenen Header zumindest für Linux ausreichen?
– alk
22. Mai 2017 um 19:05 Uhr
-
S_ISDIR ist nur für POSIX, nicht für Windows, siehe diesen SO-Beitrag
– gezzakopf
9. April 2018 um 8:45 Uhr
alk
Sie könnten verwenden stat()
und übergebe ihr die Adresse von a struct stat
und überprüfen Sie dann sein Mitglied st_mode
um zu haben S_IFDIR
einstellen.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
...
char d[] = "mydir";
struct stat s = {0};
if (!stat(d, &s))
printf("'%s' is %sa directory.\n", d, (s.st_mode & S_IFDIR) : "" ? "not ");
// (s.st_mode & S_IFDIR) can be replaced with S_ISDIR(s.st_mode)
else
perror("stat()");
-
Ich habe mich gefragt
S_IFDIR
vsS_ISDIR
und fand dies auf derstat
Manpage: „POSIX.1-1990 hat die Konstanten S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX nicht beschrieben, sondern stattdessen die Verwendung der Makros S_ISDIR() usw. gefordert. Die S_IF*-Konstanten sind in vorhanden POSIX.1-2001 und später.”– Domson
25. Mai 2021 um 8:28 Uhr
-
(s.st_mode & S_IFDIR) : "" ? "not "
Du scheinst das verwechselt zu haben?
und:
– Benutzer16217248
6. August 2021 um 22:28 Uhr
Der beste Weg ist wahrscheinlich der Versuch, es zu öffnen, indem Sie einfach verwenden opendir()
zum Beispiel.
Beachten Sie, dass es immer am besten ist, es zu versuchen verwenden B. eine Dateisystemressource, und behandeln Sie alle Fehler, die auftreten, weil sie nicht existiert, anstatt sie nur zu überprüfen und später zu versuchen. Beim letzteren Ansatz gibt es eine offensichtliche Wettlaufbedingung.
Entsprechend Mann(2)stat Sie können das Makro S_ISDIR für das Feld st_mode verwenden:
bool isdir = S_ISDIR(st.st_mode);
Randbemerkung: Ich würde empfehlen, Boost und/oder Qt4 zu verwenden, um die plattformübergreifende Unterstützung zu vereinfachen, wenn Ihre Software auf anderen Betriebssystemen funktionsfähig ist.
pevik
Sie können auch verwenden access
in Kombination mit opendir
um festzustellen, ob das Verzeichnis existiert, und ob der Name existiert, aber kein Verzeichnis ist. Zum Beispiel:
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
/* test that dir exists (1 success, -1 does not exist, -2 not dir) */
int
xis_dir (const char *d)
{
DIR *dirptr;
if (access ( d, F_OK ) != -1 ) {
// file exists
if ((dirptr = opendir (d)) != NULL) {
closedir (dirptr); /* d exists and is a directory */
} else {
return -2; /* d exists but is not a directory */
}
} else {
return -1; /* d does not exist */
}
return 1;
}
Mögliches Duplikat von C, um schneller zu überprüfen, ob ein Verzeichnis existiert
– patryk.beza
22. Dezember 2016 um 11:50 Uhr
Beantwortet das deine Frage? Überprüfen, ob ein Verzeichnis in Unix existiert (Systemaufruf)
– MasterHD
19. Januar 2021 um 10:40 Uhr