您的位置:首页 >如何使用readdir实现目录树遍历
发布于2026-04-21 阅读(0)
扫一扫,手机访问
在C语言中,readdir 函数是读取目录内容的核心工具。如果想用它来遍历整个目录树,关键思路其实很清晰:递归。你需要让程序能够“深入”每一个子目录,并对其中所有的文件和文件夹执行相应的操作。下面,我们就通过一个具体的代码示例,来完整展示这一过程是如何实现的。
这段程序的核心是一个递归函数。它接受一个目录路径作为起点,然后像探索迷宫一样,逐层深入。
#include
#include
#include
#include
#include
void tra verse_directory(const char *path) {
DIR *dir;
struct dirent *entry;
struct stat path_stat;
char full_path[1024];
dir = opendir(path);
if (dir == NULL) {
perror("opendir");
return;
}
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name);
if (stat(full_path, &path_stat) == -1) {
perror("stat");
continue;
}
if (S_ISDIR(path_stat.st_mode)) {
printf("Directory: %s\n", full_path);
tra verse_directory(full_path);
} else {
printf("File: %s\n", full_path);
}
}
closedir(dir);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n" , argv[0]);
return 1;
}
tra verse_directory(argv[1]);
return 0;
}
这个程序的工作流程可以拆解为几个明确的步骤。首先,它从命令行获取一个目标目录路径。接着,核心函数 tra verse_directory 登场:它使用 opendir 打开目录,然后通过 readdir 循环读取其中的每一个条目。
这里有个细节需要注意:为了避免陷入无限循环,程序会主动跳过代表当前目录(“.”)和上级目录(“..”)的特殊条目。对于其他每一个条目,它都会使用 stat 函数来获取其详细信息。
接下来的判断就是递归的精髓所在了。如果 stat 的结果表明当前条目是一个目录,程序会先打印其路径,然后毫不犹豫地调用自身,把这个子目录的路径作为新的起点传进去——这就是所谓的“深度优先”遍历。反之,如果只是一个普通文件,那么直接打印出文件路径即可。当某个目录下的所有条目都处理完毕后,程序会关闭当前目录句柄,并返回到上一层调用中,继续之前的遍历,直到探索完整个树形结构。
动手试试看吧。将上面的代码保存为一个文件,比如叫做 tra verse_directory.c。打开终端,使用下面的命令进行编译:
gcc tra verse_directory.c -o tra verse_directory
编译成功后,你会得到一个可执行文件。运行它时,记得在命令后面跟上你想要探索的目录路径:
./tra verse_directory /path/to/directory
只需把 /path/to/directory 替换成实际的目录路径,程序就会开始工作,逐层列出它发现的所有目录和文件,让你对整个目录树的结构一目了然。
下一篇:怎样用Nginx限制访问频率
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9