在 Ubuntu(以及一般的 Linux/Unix 系统)中,opendir 和 readdir 都是 用于目录操作的 C 库函数(定义在 <dirent.h> 中),但它们的作用和阶段不同。
打开一个目录,返回一个目录流(DIR*),并不读取目录内容。
#include <dirent.h>
DIR *opendir(const char *name);
name:目录路径,例如 "/home/user"DIR*(目录流指针)NULL,并设置 errnoDIR *dir = opendir("/home");
if (dir == NULL) {
perror("opendir");
}
✅ 一句话总结:
opendir = 打开目录,准备读
从 opendir 打开的目录流中,逐个读取目录项(文件/子目录)。
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
dirp:opendir 返回的 DIR*struct dirent*NULLNULL,设置 errnostruct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
✅ 一句话总结:
readdir = 读取目录中的内容
opendir → readdir → closedir
#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;
}
| 对比项 | opendir | readdir |
|---|---|---|
| 功能 | 打开目录 | 读取目录项 |
| 是否需要目录路径 | ✅ 是 | ❌ 否 |
| 返回值 | DIR* |
struct dirent* |
| 是否读取文件内容 | ❌ | ❌ |
| 是否必须配合使用 | 是 | 是 |
closedir:关闭目录流(别忘了)readdir 不会递归子目录struct dirent 中的 d_name 是文件名,不是完整路径如果你是想 用 C / C++ / Shell / Python 对比目录操作,也可以告诉我。