简短结论:readdir 本身不能递归子目录,只能读取“当前目录”里的条目。
在 Linux(POSIX)中:
opendir():打开一个目录readdir():逐个读取该目录下的条目(文件 / 子目录 / 符号链接等)closedir():关闭目录readdir 只会返回当前目录的内容,不会自动进入子目录。
你需要自己判断:
readdir 返回的 d_type == DT_DIR(或 stat 显示是目录). 和 ..opendir + readdir示例逻辑(C 伪代码):
void list_dir(const char *path) {
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s/%s\n", path, entry->d_name);
if (entry->d_type == DT_DIR) {
char sub[512];
snprintf(sub, sizeof(sub), "%s/%s", path, entry->d_name);
list_dir(sub); // 递归
}
}
closedir(dir);
}
readdir 不是线程安全的(可用 readdir_r,已逐步废弃)ftw() / nftw()(标准库自带递归)find 命令glob()(有限递归)如果你愿意,我可以给你完整可编译的 C 示例或对比 readdir vs nftw。