在 Linux 下使用 readdir(或 readdir_r、getdents 等)读取目录时,目录本身并没有“分页”概念,通常是一次性遍历全部条目。如果你的目标是“像分页一样分批读取目录内容”,常见做法有下面几种。
readdir 本身就是一个迭代器:
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 每读一条,计数
}
closedir(dir);
page * size 条size 条后停止int offset = page * size;
int count = 0;
while ((entry = readdir(dir)) != NULL) {
if (count < offset) {
count++;
continue;
}
if (count >= offset + size)
break;
printf("%s\n", entry->d_name);
count++;
}
✅ 优点:简单、可移植
❌ 缺点:每次都要从头遍历(大目录慢)
如果你需要多次分页请求(如 Web API):
// 第一次读取全部
readdir → 存到数组/vector
// 后续直接切片
list[page*size : page*size+size]
✅ 适合目录不大
❌ 目录变化会不一致
telldir / seekdir(推荐)DIR *dir = opendir(path);
off_t pos = telldir(dir); // 记录位置
分页示例:
seekdir(dir, saved_pos);
for (int i = 0; i < size; i++) {
entry = readdir(dir);
if (!entry) break;
printf("%s\n", entry->d_name);
}
saved_pos = telldir(dir);
✅ 不需要重新遍历
⚠️ 注意:
telldir/seekdir 不是 POSIX 强制高效readdir 内部调用 getdents64
#include <sys/syscall.h>
#include <linux/dirent.h>
适合:
ls、find)如果目录会变化:
inode 或 d_name 排序| 方法 | 是否推荐 | 说明 |
|---|---|---|
| readdir + 计数 | ✅ | 简单通用 |
| 缓存列表 | ✅ | 小目录 |
| telldir/seekdir | ✅✅ | 多次分页 |
| getdents | ⚠️ | 高性能场景 |
| 系统级分页 | ❌ | 不存在 |
如果你能说明:
我可以给你更具体的代码示例。