简要结论:可以,但“大目录”对 readdir 的性能、内存和时间影响很大,是否“能读”取决于你怎么用、目录有多大、文件系统是什么。
下面分点说清楚。
能。
readdir() / readdir_r() 是逐条返回目录项的,不是一次性把整个目录读进内存。readdir 循环读多少。例如:
DIR *d = opendir("/bigdir");
struct dirent *e;
while ((e = readdir(d)) != NULL) {
// 处理 e->d_name
}
closedir(d);
在 Debian / Linux 上,大目录常见痛点:
比如:
问题包括:
opendir 后第一次 readdir 可能很慢| 文件系统 | 大目录表现 |
|---|---|
| ext4 | 还行,但超大目录会慢 |
| xfs | 对大目录更友好 |
| btrfs | 视情况 |
| tmpfs | 内存够就快 |
| NFS | 非常慢,尤其 stat 每个文件 |
通常不是 readdir 本身,而是:
while ((e = readdir(d))) {
stat(e->d_name, &st); // 很慢
}
✅ 改进:
readdir + d_type(如果文件系统支持)stat 用 getdents64 + 批量处理实际上:
readdir 是 glibc 封装getdents64 系统调用所以:
data/00/ data/01/ ...
几乎不会“读不了”,但可能:
如果你愿意,可以告诉我:
我可以直接给你最优读取方案或代码示例。