在 Linux 下,readdir 返回 NULL 并不一定表示“目录为空”,而是有多种可能。下面按常见原因 + 排查方法来说明。
readdir 返回 NULL 的两种含义struct dirent *readdir(DIR *dirp);
⚠️ 无法仅靠返回值区分这两种情况
这是最常见、也是“正确”的 NULL。
while ((entry = readdir(dir)) != NULL) {
// 正常处理
}
// 最后一定会返回 NULL
✅ 目录本身可能是空的,也可能是读完了。
opendir 失败,但你仍在用 NULL 目录DIR *dir = opendir("/some/path");
// 没检查 dir == NULL
readdir(dir); // 未定义行为 / 可能立刻返回 NULL
✅ 正确做法:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return -1;
}
r + x)ls -ld /some/dir
权限不足时 opendir 会失败。
ls -a /path
若只有 . 和 ..,readdir 会直接返回 NULL。
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, "skip") == 0)
break; // 你以为是空,其实只是 break
}
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
printf("目录读取结束\n");
}
}
#include <dirent.h>
#include <stdio.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;
}
opendir 是否成功?errno?如果你愿意,可以把你的代码片段 + 目录情况贴出来,我可以直接帮你定位是哪一种原因。