温馨提示×

ubuntu readdir和opendir区别

小樊
48
2026-10-12 11:01:26
栏目: 智能运维

在 Ubuntu(以及更一般的 Linux/Unix 系统)中,opendir 和 readdir 都是 用于读取目录内容 的标准 C 库函数(定义在 <dirent.h> 中),但它们的作用不同:


1. opendir —— 打开目录

作用:打开一个目录,返回一个目录流指针(DIR *)。

函数原型:

#include <dirent.h>

DIR *opendir(const char *name);

参数:

  • name:目录路径,例如 "/home/user"

返回值:

  • 成功:返回 DIR *(目录流)
  • 失败:返回 NULL,并设置 errno

示例:

DIR *dir = opendir("/home/user");
if (dir == NULL) {
    perror("opendir");
}

✅ opendir 只是“打开目录”,不会读取内容


2. readdir —— 读取目录项

作用:从已打开的目录流中,读取下一个目录项(文件或子目录)。

函数原型:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

参数:

  • dirp:opendir 返回的 DIR *

返回值:

  • 成功:返回 struct dirent *
  • 到达目录末尾:返回 NULL
  • 出错:返回 NULL,并设置 errno

示例:

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

✅ readdir 必须配合 opendir 使用


3. 典型配合使用流程

#include <stdio.h>
#include <dirent.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;
}

4. 对比总结

对比项 opendir readdir
作用 打开目录 读取目录项
参数 目录路径 DIR *
返回值 DIR * struct dirent *
是否必须 是 是(在 opendir 后)
类似文件操作 fopen fread

5. 补充说明

  • 读取完目录后要用 closedir(DIR *) 关闭
  • readdir 会返回 . 和 ..
  • 线程安全版本:readdir_r(已逐渐不推荐)

如果你是想了解 系统调用层面(open / getdents) 或 Python 中的对应函数,也可以继续问我。

0 踩