在 CentOS(或者说 Linux 通用的 readdir / getdents 机制)里,“readdir 丢文件”通常不是真的丢了,而是使用方式或环境导致看起来少了。下面按常见原因给你排一下:
readdir,但中途修改了目录遍历目录时,如果在循环中:
就可能导致某些文件不被 readdir 返回。
readdir 底层是 getdents,它依赖内核返回的目录项游标。目录结构在遍历过程中变化,会导致:
✅ 解决
readdir 把所有文件名存到数组while ((de = readdir(dir))) {
names.push_back(de->d_name);
}
closedir(dir);
// 再处理 names
d_name,忽略了 . 和 ..有些新手会这样写:
if (de->d_name[0] == '.') continue;
这会直接跳过隐藏文件,看起来像“丢文件”。
如果你是:
getdentsbuffer 太小会导致:
✅ 建议
opendir/readdirgetdents 除非你很清楚CentOS 上如果目录在:
readdir 丢文件是高概率事件
readdir 是“有状态游标”都会导致:
✅ 解决
ls > filelistfind如果你是:
readdir 可能:
ext4 大目录(几万+文件):
readdir,而是 scandir 但 filter 写错scandir(path, &namelist, filter, alphasort);
filter 返回非 0 才保留,写反了就“丢”。
某些文件直接 不返回,而不是 EACCES。
. 开头?getdents?ls / find 对比一下数量如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一条。