温馨提示×

centos readdir怎么分页读

小樊
34
2026-10-09 01:28:02
栏目: 智能运维

在 CentOS(Linux) 下,如果你说的 readdir 是指 C 语言里的 readdir() / readdir_r(),或者 shell 里 ls 的分页读取,下面分别说明。


一、C 语言中 readdir 分页读取目录

1. readdir 本身不支持“分页”

readdir() 是顺序读取目录项的:

DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}
closedir(dir);

它一次只返回一个目录项,没有 offset / limit 参数。


2. 自己实现“分页”读取(推荐)

思路:

  • 用一个变量统计已读取数量
  • 跳过前面的 N 条
  • 只取后面的 M 条

示例:每页 100 条

#include <dirent.h>
#include <stdio.h>

void readdir_page(const char *path, int page, int page_size) {
    DIR *dir = opendir(path);
    if (!dir) return;

    struct dirent *entry;
    int count = 0;
    int start = page * page_size;
    int end = start + page_size;

    while ((entry = readdir(dir)) != NULL) {
        if (count < start) {
            count++;
            continue;
        }
        if (count >= end)
            break;

        printf("%s\n", entry->d_name);
        count++;
    }
    closedir(dir);
}

调用:

readdir_page("/var/log", 2, 100); // 第3页,每页100条

✅ 优点:简单、兼容所有 CentOS 版本
❌ 缺点:目录很大时效率一般


3. 使用 telldir / seekdir(不推荐)

long pos = telldir(dir);
seekdir(dir, pos);

问题:

  • 不是所有文件系统都可靠
  • CentOS 上一般不建议用于分页

二、Shell 中的“分页读目录”

1. ls + head / tail

ls /var/log | head -100
ls /var/log | tail -n +101 | head -100

2. 按页查看(交互)

ls /var/log | less

3. 排序分页(推荐)

ls -1 /var/log | sort | sed -n '101,200p'

三、如果你是指 getdents 系统调用

在 Linux 内部,readdir 实际调用 getdents64:

#include <sys/syscall.h>
#include <linux/dirent.h>

但一般应用层不建议直接用,除非写底层工具。


四、总结建议

场景 推荐方式
C 程序 自己计数分页
Shell `ls
超大目录 考虑数据库或索引
稳定性 不要用 seekdir 分页

如果你能告诉我:

  • 是用 C / C++ / Python / Shell
  • 目录大概多少文件
  • 是否需要排序

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

0 踩