在 Debian(以及所有类 Unix/Linux 系统)中,opendir 和 readdir 是 用来遍历目录内容的一对配套函数,通常配合 closedir 使用。它们都来自 POSIX 标准,定义在 <dirent.h> 中。
下面从关系、使用流程、原理和示例几个方面说明。
| 函数 | 作用 |
|---|---|
opendir |
打开一个目录,返回一个目录流(DIR *) |
readdir |
从目录流中读取下一个目录项(文件/子目录) |
closedir |
关闭目录流,释放资源 |
关系一句话总结:
opendir打开目录,readdir不断读取目录项,最后用closedir关闭。
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
DIR *dir = opendir("/path/to/dir");
if (!dir) {
perror("opendir");
return -1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
opendir
/home)DIR *(类似 FILE *)readdir
NULL 表示:
errno)closedir
DIR * 相关资源struct dirent {
ino_t d_ino; // inode 号
off_t d_off; // 偏移
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型
char d_name[]; // 文件名
};
示例判断类型:
if (entry->d_type == DT_DIR) {
// 目录
}
在 Debian(glibc)中:
opendir → 内部调用 open() + getdents64()readdir → 缓冲并解析 getdents64() 返回的数据closedir → close()可以用 strace 查看:
strace ls /tmp
会读到 . 和 ..
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
不是递归的
readdir 只读当前目录线程安全
readdir 不是线程安全readdir_r(已废弃)或 readdir + 锁在 Debian 中,
opendir用来“打开目录”,readdir用来“逐个读取目录里的文件”,二者是生产者—消费者式的一对函数,必须配合使用,最后用closedir收尾。
如果你愿意,我也可以:
readdir vs scandir