在 Debian(以及一般 Linux)上,readdir() “漏读文件”通常不是 glibc 或内核 bug,而是使用方式或环境差异导致的。下面按常见原因从高到低说明。
readdir() 返回的是相对名,不是绝对路径很多“漏读”其实是路径拼错,导致后续 stat/open 失败,看起来像没读到。
DIR *d = opendir("/data/logs");
struct dirent *e;
while ((e = readdir(d))) {
// 错误:用 e->d_name 直接打开
// open(e->d_name, ...) // ❌ 当前目录不一定在 /data/logs
}
✅ 正确做法:
char path[1024];
snprintf(path, sizeof(path), "%s/%s", "/data/logs", e->d_name);
在以下场景中,readdir() 可能:
常见问题:
✅ 排查:
mount | grep 目录
df -T 目录
readdir() 本身是可靠的,但:
✅ 建议:
getdents64()(更底层)ls > list.txt 快照. 开头)被你代码过滤掉了readdir() 一定会返回:
.
..
.hidden
如果你写了:
if (e->d_name[0] == '.') continue;
就会“漏掉”隐藏文件。
x 权限但无 rstat 失败被跳过✅ 检查:
ls -la 目录
namei -l 路径
readdir_r() 且 buffer 太小(已废弃)旧代码常见错误:
readdir_r(dir, &entry, &result);
在多线程或长文件名下可能出错。
✅ 现代写法:
while ((e = readdir(dir)) != NULL)
导致:
仅在以下情况可能存在:
fsck 检查)✅ 是否拼了完整路径
✅ 是否过滤了 . 文件
✅ 是否网络/挂载文件系统
✅ 遍历时目录是否被修改
✅ 权限是否足够
如果你愿意,可以把:
readdir() 代码mount 信息贴出来,我可以直接帮你定位是哪一类问题。