在 Debian(以及其它类 Unix/Linux 系统)中,opendir 和 readdir 都是 POSIX 标准目录操作函数,通常一起配合使用,但作用和阶段不同。
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;
}
✅ 只负责“打开目录”,不读取内容。
readdir —— 读取目录项作用:从 opendir 打开的目录流中,逐个读取目录项(文件/子目录)。
函数原型:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
参数:
dirp:opendir 返回的 DIR *返回值:
struct dirent *NULLNULL,并设置 errno示例:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
✅ 每次调用读取一个目录项,循环使用。
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);
| 对比项 | opendir | readdir |
|---|---|---|
| 功能 | 打开目录 | 读取目录内容 |
| 返回值 | DIR * |
struct dirent * |
| 是否读文件 | 否 | 是(逐个) |
| 使用顺序 | 先 | 后 |
| 必须配对 | closedir | — |
. 和 .. 也会被 readdir 读到readdir_r(已不推荐)scandir、fts、nftw如果你愿意,我也可以:
opendir/readdir 和 stat