在 Linux 下使用 readdir()(或 opendir()/readdir() 系列)时“漏文件”,通常不是 readdir() 本身有 bug,而是使用方式或场景导致看起来“少文件”。下面按常见原因逐一说明。
readdir() 返回的是目录项在底层文件系统中的顺序(通常是 inode 或 hash 顺序),而不是快照。
如果在遍历时:
readdir() 收集所有文件名到数组while ((ent = readdir(dir))) {
names[n++] = strdup(ent->d_name);
}
closedir(dir);
ent = readdir(dir);
printf("%s\n", ent->d_name); // 只读了一次
while ((ent = readdir(dir)) != NULL) {
...
}
. 和 .. 但误以为漏了readdir() 一定会返回:
...如果你过滤了它们,但统计总数时没算,会“以为漏了”。
if (strcmp(ent->d_name, ".") == 0 ||
strcmp(ent->d_name, "..") == 0)
continue;
readdir() 不保证一致性(非 POSIX 强一致)解决:
fsync + 暂停写入stat() 逐个确认readdir() 只看到挂载点本身检查:
mount | grep 目录
ls -l 目录
r 权限:目录打不开x 权限:能看到目录但读不到内容ls -ld 目录
可能看到旧目录项。
scandir() / glob() 但模式写错例如:
glob("*.txt", ...); // 隐藏文件漏了
某些旧实现或错误:
d_name 缓冲区太小readdir_r() 或线程安全版本
readdir()不会“随机漏文件”,漏文件几乎总是:遍历中改目录、逻辑错误、或文件系统特性。
如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一种。