在 Ubuntu(以及一般的 Linux/Unix 系统)中,opendir 和 readdir 是 用于目录遍历的一对配套函数,它们都来自标准 C 库(dirent.h)。
简单说:
opendir:打开目录,获得一个目录流(directory stream)readdir:读取目录项,从目录流中逐个获取文件/子目录信息closedir 关闭它们的关系是:
opendir→ 得到DIR*
readdir→ 不断从DIR*中读
closedir→ 释放资源
#include <dirent.h>
DIR *opendir(const char *name);
name 是目录路径DIR *(目录流指针)NULL,并设置 errno#include <dirent.h>
struct dirent *readdir(DIR *dirp);
dirp 是 opendir 的返回值struct dirent 的指针NULLint closedir(DIR *dirp);
readdir 返回的结构体通常包含:
struct dirent {
ino_t d_ino; // inode 号
off_t d_off; // 偏移(Linux 特有)
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型
char d_name[]; // 文件名
};
常用的是 d_name。
#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
readdir_r(已不推荐)readdir + 单线程或加锁. 和 ... 表示当前目录.. 表示上级目录stat 混用误解readdir 不获取文件大小、权限stat()opendir / readdir 是 C 库封装open()getdents64()(Linux 特有系统调用)getdents在 Ubuntu 中,
opendir打开目录,readdir逐个读取目录项,两者配合完成目录遍历,最后用closedir关闭。
如果你愿意,我也可以讲:
readdir vs scandiropendir 失败常见原因FindFirstFile 的对比