如何列出C中给定目录中的所有子目录?

有没有办法列出在C中给定的目录path中的所有子目录? 我希望能用stat()函数来完成它,但它只能在文件上工作。

Solutions Collecting From Web of "如何列出C中给定目录中的所有子目录?"

stat也在目录上工作。

 #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> int num_dirs(const char* path) { int dir_count = 0; struct dirent* dent; DIR* srcdir = opendir(path); if (srcdir == NULL) { perror("opendir"); return -1; } while((dent = readdir(srcdir)) != NULL) { struct stat st; if(strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0) continue; if (fstatat(dirfd(srcdir), dent->d_name, &st, 0) < 0) { perror(dent->d_name); continue; } if (S_ISDIR(st.st_mode)) dir_count++; } closedir(srcdir); return dir_count; } 

你想要readdir(3) 。

正如其他人所指出的, stat(2)在所有类型的文件和设备上工作正常。 它通过符号链接读取远端文件; 如果您需要关于符号链接本身的信息,请使用lstat(2)

要列出单个目录中所有目录的名称(非递归),请使用readdir(3)系列函数的组合。

要递归地列出所有目录的名字,使用ftw(3)或者nftw(3)函数做一个“文件树遍历”(从那里来的名字;'n'是'new')。

 /* I had need in something like this not so long ago (my difference is I needed recursive scan) so I added only some comments... Sorry for recursion but I was short of time and this was only part of internal one-time tool. */ /* Print all the dirs starting from <path> [maybe recursive]. */ int print_dirs(const char *path, int recursive) { struct dirent *direntp = NULL; DIR *dirp = NULL; size_t path_len; /* Check input parameters. */ if (!path) return -1; path_len = strlen(path); if (!path || !path_len || (path_len > _POSIX_PATH_MAX)) return -1; /* Open directory */ dirp = opendir(path); if (dirp == NULL) return -1; while ((direntp = readdir(dirp)) != NULL) { /* For every directory entry... */ struct stat fstat; char full_name[_POSIX_PATH_MAX + 1]; /* Calculate full name, check we are in file length limts */ if ((path_len + strlen(direntp->d_name) + 1) > _POSIX_PATH_MAX) continue; strcpy(full_name, path); if (full_name[path_len - 1] != '/') strcat(full_name, "/"); strcat(full_name, direntp->d_name); /* Ignore special directories. */ if ((strcmp(direntp->d_name, ".") == 0) || (strcmp(direntp->d_name, "..") == 0)) continue; /* Print only if it is really directory. */ if (stat(full_name, &fstat) < 0) continue; if (S_ISDIR(fstat.st_mode)) { printf("%s\n", full_name); if (recursive) print_dirs(full_name, 1); } } /* Finalize resources. */ (void)closedir(dirp); return 0; } /* We are taking first argument as initial path name. */ int main(int argc, const char* argv[]) { if (argc < 2) return -1; print_dirs(argv[1], 1); return 0; }