在 Debian(或者说 Linux 下 C/C++ 编程)中,readdir 本身不支持分页,它是顺序读取目录项的。如果你需要“分页”效果,一般有以下几种做法。
适合目录文件数量不是特别巨大(几万以内)的情况。
opendir + readdir 把所有目录项读出来#include <dirent.h>
#include <vector>
#include <string>
std::vector<std::string> list_dir(const char* path) {
std::vector<std::string> files;
DIR* dir = opendir(path);
if (!dir) return files;
struct dirent* entry;
while ((entry = readdir(dir)) != nullptr) {
if (entry->d_name[0] == '.') continue; // 忽略 . 和 ..
files.push_back(entry->d_name);
}
closedir(dir);
return files;
}
使用时:
int page = 2;
int page_size = 10;
auto files = list_dir("/data");
int start = page * page_size;
for (int i = start; i < start + page_size && i < files.size(); i++) {
printf("%s\n", files[i].c_str());
}
✅ 优点:简单、逻辑清晰
❌ 缺点:目录很大时内存占用高
如果目录有几百万文件,不能一次性读。
readdir 边读边计数offset 个limit 个后停止void readdir_page(const char* path, int offset, int limit) {
DIR* dir = opendir(path);
if (!dir) return;
struct dirent* entry;
int count = 0;
int printed = 0;
while ((entry = readdir(dir)) != nullptr) {
if (entry->d_name[0] == '.') continue;
if (count < offset) {
count++;
continue;
}
printf("%s\n", entry->d_name);
printed++;
if (printed >= limit) break;
}
closedir(dir);
}
⚠️ 注意:
getdents(底层,更高效)getdents64 是 readdir 的底层系统调用,性能更好,但仍不天然支持分页。
适合:
(一般用户态程序不推荐直接用)
如果你只是想在终端里分页查看:
ls | less
ls | head -n 20
ls | tail -n +21 | head -n 10
| 场景 | 推荐方案 |
|---|---|
| 普通目录 | 一次性 readdir + 内存分页 |
| 超大目录 | 流式 offset/limit |
| 系统工具 | getdents |
| 仅查看 | ls + less |
如果你能说明:
我可以给你更精确的代码方案。