温馨提示×

debian readdir和opendir区别

小樊
54
2026-09-01 10:17:22
栏目: 智能运维

在 Debian(以及其它类 Unix/Linux 系统)中,opendir 和 readdir 都是 POSIX 标准目录操作函数,通常一起配合使用,但作用和阶段不同。


1. opendir —— 打开目录

作用:打开一个目录,返回一个目录流(DIR *),供后续读取使用。

函数原型:

#include <dirent.h>

DIR *opendir(const char *name);

参数:

  • name:目录路径(如 "/home/user")

返回值:

  • 成功:返回 DIR * 指针
  • 失败:返回 NULL,并设置 errno

示例:

DIR *dir = opendir("/tmp");
if (dir == NULL) {
    perror("opendir");
    return 1;
}

✅ 只负责“打开目录”,不读取内容。


2. readdir —— 读取目录项

作用:从 opendir 打开的目录流中,逐个读取目录项(文件/子目录)。

函数原型:

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

✅ 每次调用读取一个目录项,循环使用。


3. 两者关系(流程)

opendir()  →  打开目录(得到 DIR*)
   ↓
readdir()  →  逐个读取文件/目录
   ↓
closedir() →  关闭目录

完整示例:

DIR *dir = opendir("/tmp");
if (!dir) {
    perror("opendir");
    return 1;
}

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

closedir(dir);

4. 核心区别总结

对比项 opendir readdir
功能 打开目录 读取目录内容
返回值 DIR * struct dirent *
是否读文件 否 是(逐个)
使用顺序 先 后
必须配对 closedir —

5. 常见注意点(Debian / Linux)

  • . 和 .. 也会被 readdir 读到
  • 不是递归的(不会自动进子目录)
  • 线程安全版本:readdir_r(已不推荐)
  • 更现代替代:scandir、fts、nftw

如果你愿意,我也可以:

  • 给你一个 递归遍历目录示例
  • 对比 opendir/readdir 和 stat
  • 讲 C++ / Python 中的对应方式

0 踩