简短结论:readdir 本身不会递归读取子目录,它只读取“当前目录”里的条目(包括子目录项,但不会进入子目录去读)。
下面详细说明:
readdir 做什么在 Linux / POSIX 中:
#include <dirent.h>
DIR *opendir(const char *path);
struct dirent *readdir(DIR *dirp);
opendir:打开一个目录readdir:一次返回一个目录项(struct dirent)DT_DIR)⚠️ 关键点:
readdir 只读取该目录本身的内容列表,并不会自动进入子目录。
readdir 中如何出现子目录在 readdir 的结果中,只是一个条目:
/test
├── a.txt
├── subdir/ <-- readdir 会读到这个名字
└── b.log
readdir 会返回:
a.txtsubdir(类型是目录)b.log但不会返回:
subdir/file1
subdir/file2
如果你想读子目录,需要:
if (entry->d_type == DT_DIR) {
// 跳过 . 和 ..
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
char path[PATH_MAX];
snprintf(path, sizeof(path), "%s/%s", dir_path, entry->d_name);
DIR *subdir = opendir(path);
// 再对 subdir 调用 readdir
}
也就是:自己递归调用 opendir + readdir
| 误解 | 事实 |
|---|---|
readdir 会自动遍历整个目录树 |
❌ 不会 |
readdir 返回的文件包含子目录内文件 |
❌ 不包含 |
子目录在 readdir 中不可见 |
❌ 可见,但只是名字 |
可选方案:
fts()(fts_open / fts_read)nftw()(目录树遍历)find如果你是想问 某个具体语言(如 Python / C++ / Shell)里的 readdir 行为,或者 性能 / 深度限制问题,可以继续问。