在 Debian(Linux) 下,readdir 本身 不支持分页,它只是按顺序读取目录项(每次返回一个 struct dirent)。所谓“分页”通常是 在应用层自己控制 的。
下面分几种常见场景说明。
#include <dirent.h>
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 每次读取一个目录项
}
closedir(dir);
readdir 无法指定 offset / limitreaddir 遍历目录#define PAGE_SIZE 20
char *names[1000];
int count = 0;
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir))) {
names[count++] = strdup(entry->d_name);
}
closedir(dir);
// 第 page 页
int page = 2;
int start = page * PAGE_SIZE;
for (int i = start; i < start + PAGE_SIZE && i < count; i++) {
printf("%s\n", names[i]);
}
✅ 优点:简单、稳定
❌ 缺点:目录很大时内存占用高
适合 大目录
int page = 3;
int page_size = 50;
int skip = page * page_size;
int index = 0;
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir))) {
if (index++ < skip) continue;
if (index >= skip + page_size) break;
printf("%s\n", entry->d_name);
}
closedir(dir);
✅ 内存友好
❌ 每次翻页都要重新遍历
readdir 顺序 不稳定
目录内容变化时:
readdir + 排序scandirstruct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
getdents64(系统调用)| 方式 | 是否推荐 | 说明 |
|---|---|---|
| readdir + 数组 | ✅ | 简单分页 |
| readdir 流式 | ✅ | 大目录 |
| scandir | ✅✅ | 排序分页首选 |
| getdents64 | ⚠️ | 高级用法 |
如果你能告诉我:
我可以给你一个 可直接用的分页实现。