代替opendir()
,您可以使用 、 和 的组合openat()
,dirfd()
并fdopendir()
构造一个递归函数来遍历目录树:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
void
dir_recurse (DIR *parent, int level)
{
struct dirent *ent;
DIR *child;
int fd;
while ((ent = readdir(parent)) != NULL) {
if ((strcmp(ent->d_name, ".") == 0) ||
(strcmp(ent->d_name, "..") == 0)) {
continue;
}
if (ent->d_type == DT_DIR) {
printf("%*s%s/\n", level, "", ent->d_name);
fd = openat(dirfd(parent), ent->d_name, O_RDONLY | O_DIRECTORY);
if (fd != -1) {
child = fdopendir(fd);
dir_recurse(child, level + 1);
closedir(child);
} else {
perror("open");
}
} else {
printf("%*s%s\n", level, "", ent->d_name);
}
}
}
int
main (int argc, char *argv)
{
DIR *root;
root = opendir(".");
dir_recurse(root, 0);
closedir(root);
return 0;
}
这里readdir()
仍然用于获取下一个目录条目。如果下一个条目是一个目录,那么我们找到父目录 fddirfd()
并将其与子目录名称一起传递给openat()
. 结果 fd 引用子目录。这被传递给fdopendir()
返回DIR *
子目录的指针,然后可以将其传递给我们的dir_recurse()
位置,它再次对readdir()
调用有效。
该程序在以.
. 打印条目,每个目录级别缩进 1 个空格。目录以结尾打印/
。
在 ideone 上。