温馨提示×

debian readdir如何分页

小樊
44
2026-09-04 11:57:34
栏目: 智能运维

在 Debian(或者说 Linux 下 C/C++ 编程)中,readdir 本身不支持分页,它是顺序读取目录项的。如果你需要“分页”效果,一般有以下几种做法。


一、最常用方式:一次性读取后分页(推荐)

适合目录文件数量不是特别巨大(几万以内)的情况。

思路

  1. 用 opendir + readdir 把所有目录项读出来
  2. 存到数组 / vector 中
  3. 按页码返回对应区间

示例(C++)

#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);
}

⚠️ 注意:

  • 每次翻页都会从头扫描
  • 性能随 offset 增大而下降

三、使用 getdents(底层,更高效)

getdents64 是 readdir 的底层系统调用,性能更好,但仍不天然支持分页。

适合:

  • 高性能工具
  • 自定义文件系统遍历

(一般用户态程序不推荐直接用)


四、Shell 层面的“分页”

如果你只是想在终端里分页查看:

ls | less
ls | head -n 20
ls | tail -n +21 | head -n 10

五、总结建议

场景 推荐方案
普通目录 一次性 readdir + 内存分页
超大目录 流式 offset/limit
系统工具 getdents
仅查看 ls + less

如果你能说明:

  • 用的是 C / C++ / Python / Shell
  • 目录大概多大
  • 是否要排序

我可以给你更精确的代码方案。

0 踩