简短结论:正常情况下 readdir 不会“漏”文件,但在某些特殊场景下,可能会“看起来像漏了文件”。
下面分情况说清楚。
在 单个目录、遍历过程中目录内容不变 的情况下:
opendir + readdir + closedir也就是说:
只要你在遍历期间不修改目录,readdir 不会漏文件。
例如:
结果:
✅ 这不是 bug,而是 POSIX 的明确规定行为。
POSIX 不保证 readdir 能看到遍历开始后才发生的修改
readdir_r 但 buffer 使用错误(历史坑)老代码中常见:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
...
}
这是安全的
但如果你:
struct dirent就可能出现:
✅ 推荐直接用 readdir,不要用 readdir_r(已废弃)
这会让程序“跳过”,但不是 readdir 漏。
在 网络文件系统 上:
可能出现:
这是 网络文件系统一致性问题,不是 readdir 本身。
例如:
这其实是你代码漏了,不是系统调用漏。
DIR *dir = opendir(path);
struct dirent *ent;
while ((ent = readdir(dir)) != NULL) {
// 处理 ent->d_name
}
closedir(dir);
stat / scandir 一次性拿到所有文件stat 二次确认
readdir本身不会漏文件,但在目录被并发修改、网络文件系统、或程序逻辑错误时,会出现“漏文件”的假象。
如果你能说下:
我可以更精确地判断你遇到的到底是不是“真漏”。