在 Debian(以及所有 Linux 系统)上,readdir 本身不会“主动漏读”文件,所谓“漏读”通常是使用方式或环境特性导致的。下面按常见原因系统地说明。
readdir 不是递归的readdir 只读取当前目录下的条目,不会进入子目录。
DIR *dir = opendir("/data");
struct dirent *ent;
while ((ent = readdir(dir))) {
// 只看到 /data 下的文件/目录
}
✅ 如果你期望看到子目录里的文件,需要自己递归。
. 和 .. 被误当成“漏了”readdir 一定会返回:
. 当前目录.. 上级目录很多人以为“这些不是我的文件”,其实是正常行为。
. 开头(隐藏文件)Linux 中:
.config
.git
以 . 开头的文件是隐藏文件,readdir 会返回,但很多程序/命令(如 ls 不加 -a)不显示。
✅ readdir 没漏,是上层逻辑漏了。
如果:
readdir 过程中就可能发生:
这是文件系统语义,不是 bug。
getdents / 缓冲区问题(极少见)readdir 底层调用 getdents64:
readdir 中途崩溃 / 关闭 DIR可能导致看起来不完整
✅ 确保:
closedir(dir);
/mnt/usb (mount)
如果你只遍历一层,可能误以为“少了文件”。
link -> /somewhere/else
readdir 返回的是链接本身,不会自动展开。
如果:
x 权限r 权限结果是:
opendir 成功⚠️ 不是 readdir 漏,是权限拒绝
readdir,而是封装函数例如:
scandirglobos.listdir)它们可能有:
ls -a /your/dir
vs
strace -e getdents64 your_program
while ((ent = readdir(dir))) {
printf("{%s}\n", ent->d_name);
}
watch -n 1 "ls -a /dir"
readdir不会漏文件,漏的是你对目录语义的理解或使用方式。
如果你愿意,可以贴:
我可以精确指出你这段代码“漏读”的真正原因。