简短结论:readdir / readdir_r 本身不支持“分页”,它是顺序遍历目录项的接口;所谓“分页”需要在应用层自己实现。
下面分几点说明(以 Ubuntu / Linux 为主):
readdir 是什么在 Ubuntu(glibc)里:
readdir():返回一个 struct dirent *readdir_r():线程安全版本(已逐渐废弃)getdents / getdents64 系统调用特点:
offset / limit 参数✅ 所以:readdir 没有分页参数,也不支持 SQL 式 LIMIT/OFFSET
目录在 Linux 中是无序流:
. / ..)因此:
readdir(dir, offset=100, limit=20)while ((ent = readdir(dir)) != NULL) {
...
}
while ((e = readdir(d)) != NULL)
list.push_back(e->d_name);
// 第 page 页
auto begin = list.begin() + page * size;
auto end = begin + size;
适合:目录不大(几千以内)
int count = 0;
while ((e = readdir(d)) != NULL) {
if (count < offset) { count++; continue; }
if (count >= offset + limit) break;
count++;
// 输出 e->d_name
}
缺点:每次翻页都要重新遍历
readdir 全部读出来sort() 文件名✅ 这是最常见做法
可以:
getdents64 + 自己解析 buffer或者:
inotify 同步目录变化Ubuntu 的
readdir不能分页,只能顺序读;分页必须在用户态自己做。
如果你愿意,可以告诉我:
我可以给你一段可直接用的分页示例代码。