在 Linux(以及 POSIX 标准)中,opendir 和 readdir 都是用于遍历目录的函数,但它们的作用和调用顺序不同。
| 函数 | 作用 | 返回值 |
|---|---|---|
opendir |
打开目录,获取目录流 | DIR * |
readdir |
读取目录项(一个文件/子目录) | struct dirent * |
简单说:
opendir 是“开门”,readdir 是“一个一个看里面有什么”
#include <dirent.h>
DIR *opendir(const char *name);
name:目录路径DIR *NULL#include <dirent.h>
struct dirent *readdir(DIR *dirp);
dirp:opendir 返回的目录流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 = 关上门
readdir(NULL); // 错误
. 和 ..需要手动过滤:
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
线程安全版本:
readdir_r(); // 已逐步废弃
现代推荐用 readdir + 加锁,或用 scandir
| 函数 | 作用 |
|---|---|
closedir |
关闭目录 |
rewinddir |
重新从头读 |
seekdir / telldir |
定位目录位置 |
scandir |
一次性读取并排序 |
opendir 打开目录,readdir 读取目录内容,两者配合使用来遍历目录。
如果你愿意,我也可以帮你对比:
readdir vs statopendir vs open