温馨提示×

linux readdir和opendir区别

小樊
46
2026-09-08 15:40:31
栏目: 智能运维

在 Linux(以及 POSIX 标准)中,opendirreaddir 都是用于遍历目录的函数,但它们的作用和调用顺序不同


一、基本区别

函数 作用 返回值
opendir 打开目录,获取目录流 DIR *
readdir 读取目录项(一个文件/子目录) struct dirent *

简单说:

opendir 是“开门”,readdir 是“一个一个看里面有什么”


二、函数原型

1️⃣ opendir

#include <dirent.h>

DIR *opendir(const char *name);
  • name:目录路径
  • 成功:返回目录流指针 DIR *
  • 失败:返回 NULL

2️⃣ readdir

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
  • dirpopendir 返回的目录流
  • 成功:返回目录项指针
  • 失败或读到末尾:返回 NULL

三、典型使用流程

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

int main() {
    DIR *dir = opendir(".");
    if (!dir) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

四、对应关系比喻

目录 = 房间
opendir = 打开房门
readdir = 一个个看房间里的人
closedir = 关上门

五、常见注意点

✅ 1. 必须 opendir 后才能 readdir

readdir(NULL); // 错误

✅ 2. readdir 会返回 ...

需要手动过滤:

if (strcmp(entry->d_name, ".") == 0 ||
    strcmp(entry->d_name, "..") == 0)
    continue;

✅ 3. readdir 不是线程安全的

线程安全版本:

readdir_r();  // 已逐步废弃

现代推荐用 readdir + 加锁,或用 scandir


六、相关函数

函数 作用
closedir 关闭目录
rewinddir 重新从头读
seekdir / telldir 定位目录位置
scandir 一次性读取并排序

七、一句话总结

opendir 打开目录,readdir 读取目录内容,两者配合使用来遍历目录。

如果你愿意,我也可以帮你对比:

  • readdir vs stat
  • opendir vs open
  • C++ / Python 中的等价写法

0