温馨提示×

centos readdir和scandir区别

小樊
36
2026-10-09 01:24:59
栏目: 智能运维

在 CentOS(以及其它 Linux 系统)上,readdir 和 scandir 都是用来读取目录内容的函数,但它们在使用方式、性能、返回信息上有明显区别。下面从系统调用 / glibc 层面说明。


一、readdir

1. 基本说明

  • 函数:readdir()
  • 头文件:<dirent.h>
  • 通常配合:
    opendir()
    readdir()
    closedir()
    

2. 使用方式

DIR *dir = opendir("/path");
struct dirent *entry;

while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}
closedir(dir);

3. 特点

  • 一次返回一个目录项
  • 返回的 struct dirent 只包含:
    • 文件名 d_name
    • inode 类型(部分系统)
  • 不包含 stat 信息(如大小、权限、修改时间)
  • 如果需要文件属性,必须再调用 stat()

4. 性能问题

  • 遍历目录 + stat 每个文件
    → 多次系统调用
  • 对大目录性能较差

二、scandir

1. 基本说明

  • 函数:scandir()
  • 头文件:<dirent.h>
  • 是 glibc 提供的高级封装

2. 使用方式

struct dirent **namelist;
int n = scandir("/path", &namelist, NULL, alphasort);

for (int i = 0; i < n; i++) {
    printf("%s\n", namelist[i]->d_name);
    free(namelist[i]);
}
free(namelist);

3. 特点

  • 一次性读取整个目录
  • 返回 struct dirent ** 数组
  • 可以:
    • 过滤文件名(filter 函数)
    • 排序(如 alphasort)
  • 仍然是 dirent,不含 stat 信息

4. 优点

  • 使用简单
  • 自动排序
  • 适合目录不大、需要排序/过滤的场景

三、readdir vs scandir 核心区别

对比项 readdir scandir
读取方式 逐个读取 一次性读取
内存占用 低 高(存整个目录)
排序 无 支持
过滤 手动 支持 filter
大目录 友好 不友好
使用复杂度 稍高 简单

四、补充:readdir + stat 的问题

在 CentOS 上常见性能瓶颈:

readdir()
stat()  // 每个文件一次系统调用

解决方式(更现代):

  • readdir + fstatat(减少路径解析)
  • 或用 fts_open / nftw
  • 新系统也可用 scandirat

五、CentOS 实际建议

  • ✅ 大目录、流式处理 → opendir + readdir
  • ✅ 小目录、要排序/过滤 → scandir
  • ❌ 不要用 scandir 读几万文件的目录

如果你需要:

  • C 示例
  • 系统调用层面(getdents)
  • 和 ls / find 的实现对比

可以继续问。

0 踩