我如何检查一个目录是否存在?

我如何检查目录是否存在于Linux的C?

你可以使用opendir()并检查ENOENT == errno是否失败:

 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. */ } 

使用下面的代码来检查文件夹是否存在。 它适用于Windows和Linux平台。

 #include <stdio.h> #include <sys/stat.h> int main(int argc, char* argv[]) { const char* folderr; //folderr = "C:\\Users\\SaMaN\\Desktop\\Ppln"; folderr = "/tmp"; struct stat sb; if (stat(folderr, &sb) == 0 && S_ISDIR(sb.st_mode)) { printf("YES\n"); } else { printf("NO\n"); } } 

您可以使用stat()并将它传递给struct stat的地址,然后检查其成员st_mode是否设置了S_IFDIR

 #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()"); 

最好的方法可能是试图打开它,只是使用opendir()

请注意,最好尝试使用文件系统资源,并处理发生的任何错误,因为它不存在,而不仅仅是检查,然后再尝试。 后一种方法存在明显的竞争条件。

根据man(2)stat你可以在st_mode字段中使用S_ISDIRmacros:

 bool isdir = S_ISDIR(st.st_mode); 

注意,如果您的软件可以在其他操作系统上运行,我会推荐使用Boost和/或Qt4来简化跨平台的支持。

您也可以结合opendir使用access来确定目录是否存在,以及如果名称存在但不是目录。 例如:

 /* test that dir exists (1 success, -1 does not exist, -2 not dir) */ int xis_dir (char *d) { DIR *dirptr; if (access ( d, F_OK ) != -1 ) { // file exists if ((dirptr = opendir (d)) != NULL) { closedir (dirptr); } else { return -2; /* d exists, but not dir */ } } else { return -1; /* d does not exist */ } return 1; } 

我同意以下标题是最好的解决scheme之一:

 #include <stdio.h> #include <sys/stat.h> 

另外两种方式,也许不太正确的是使用。 第一个,只使用标准库和文件:

 FILE *f; f = fopen("file", "r") if(!f) printf("there is no file there"); 

这个可能适用于所有的操作系​​统。

或者也可以使用系统调用system()来调用dirs。 是最糟糕的select,但给你另一种方式。 对于某人也许有用。