在 Linux 下使用 readdir()(或 readdir_r())遍历目录时,**判断“结束”**主要看返回值。
readdir()(最常用)#include <dirent.h>
struct dirent *readdir(DIR *dirp);
struct dirent *NULLNULL,并设置 errno⚠️ 注意:
readdir() 返回 NULL 时,不能直接判断是“结束”还是“出错”,需要用 errno 区分。
#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main() {
DIR *dir = opendir(".");
if (!dir) {
perror("opendir");
return 1;
}
errno = 0;
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
return 0;
}
✅ 判断结束的核心逻辑
while ((entry = readdir(dir)) != NULL) {
// 正常读取
}
// 跳出循环 = 结束或出错
readdir_r()(线程安全,已逐渐废弃)int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
return 0*result == NULL示例:
struct dirent ent;
struct dirent *res;
while (readdir_r(dir, &ent, &res) == 0 && res != NULL) {
printf("%s\n", ent.d_name);
}
entry == NULL 就认为目录为空entry = readdir(dir);
if (!entry) {
// 可能是结束,也可能是出错
}
errnoreaddir() 返回 NULL 不代表一定是结束。
| 情况 | 判断方式 |
|---|---|
| 目录读取结束 | readdir() 返回 NULL 且 errno == 0 |
| 读取出错 | readdir() 返回 NULL 且 errno != 0 |
| 还有内容 | 返回非 NULL |
✅ 最佳实践:
while ((entry = readdir(dir)) != NULL)+ 循环后检查errno
如果你需要 递归遍历目录 / 过滤文件类型 / 使用 getdents 底层接口,也可以继续问我。