在 Ubuntu(以及更一般的 Linux/Unix 系统)中,opendir 和 readdir 都是 用于读取目录内容 的标准 C 库函数(定义在 <dirent.h> 中),但它们的作用不同:
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 只是“打开目录”,不会读取内容
readdir —— 读取目录项作用:从已打开的目录流中,读取下一个目录项(文件或子目录)。
函数原型:
#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);
}
✅ readdir 必须配合 opendir 使用
#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 * |
| 返回值 | DIR * |
struct dirent * |
| 是否必须 | 是 | 是(在 opendir 后) |
| 类似文件操作 | fopen |
fread |
closedir(DIR *) 关闭readdir 会返回 . 和 ..readdir_r(已逐渐不推荐)如果你是想了解 系统调用层面(open / getdents) 或 Python 中的对应函数,也可以继续问我。