在 Linux/Unix 的 C 语言编程中,readdir 用来读取目录内容,它的返回值含义如下:
readdir 的函数原型#include <dirent.h>
struct dirent *readdir(DIR *dirp);
struct dirent 的指针例如:
struct dirent *entry;
entry = readdir(dir);
entry 指向当前读到的目录项。
NULLerrno 表示错误原因NULLerrno 未被设置⚠️ 重点:
readdir返回NULL时,可能是正常结束,也可能是出错,需要结合errno判断。
#include <errno.h>
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
// 正常读取结束
}
}
struct dirent 中常见字段struct dirent {
ino_t d_ino; // inode 号
off_t d_off; // 偏移量
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型(部分系统支持)
char d_name[256]; // 文件名
};
通常最常用的是:
entry->d_name // 文件名
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);
| 返回值 | 含义 |
|---|---|
| 非 NULL | 成功读取一个目录项 |
| NULL + errno ≠ 0 | 读取失败 |
| NULL + errno = 0 | 目录已读完 |
如果你愿意,我也可以帮你对比 readdir vs readdir_r vs getdents,或者结合 Windows 的 ReadDirectoryChanges 讲区别。