在 Debian(以及所有类 Unix 系统,遵循 POSIX 标准)中,opendir 和 readdir 是 配合使用的目录操作函数,通常一起用于遍历目录内容。
下面从关系、使用流程、示例代码、注意事项几个方面说明。
| 函数 | 作用 |
|---|---|
opendir |
打开一个目录,返回一个 DIR* 目录流指针 |
readdir |
从 opendir 打开的目录流中,逐个读取目录项(文件/子目录) |
关系总结:
opendir是“开门”,readdir是“进门后一个个看里面有什么”
DIR *dir = opendir(path); // 1. 打开目录
if (!dir) {
perror("opendir");
return -1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) { // 2. 循环读取
printf("%s\n", entry->d_name);
}
closedir(dir); // 3. 关闭目录
#include <dirent.h>
DIR *opendir(const char *name);
DIR*NULL,并设置 errno#include <dirent.h>
struct dirent *readdir(DIR *dirp);
struct dirent*NULLNULL,并设置 errnostruct dirent {
ino_t d_ino; // inode 号
off_t d_off;
unsigned short d_reclen;
unsigned char d_type; // 文件类型(DT_REG, DT_DIR...)
char d_name[]; // 文件名
};
⚠️ 注意:
. 和 .. 也会被 readdir 读到d_type 在某些文件系统上可能为 DT_UNKNOWNreaddir 不是线程安全readdir_r(已废弃)或 readdir + 加锁DIR *a = opendir(".");
DIR *b = a; // ❌ 错误用法
readdir 只列出当前目录一层
| 函数 | 说明 |
|---|---|
opendir + readdir |
最基础、最常用 |
scandir |
一次性读取并排序 |
getdents |
系统调用层,更底层 |
在 Debian 中,
opendir打开目录流,readdir从流中读取目录项,二者必须配对使用,最后用closedir关闭。
如果你需要:
stat 配合使用可以继续问我。