在 Ubuntu(Linux)下调用 readdir 返回“空”,通常不是真的返回了 NULL 而没有错误,而是对返回值的理解或目录状态有问题。下面按常见原因逐个说明。
readdir 到底什么时候“返回空”struct dirent *readdir(DIR *dirp);
errno 被设置)⚠️ 注意:
readdir 不会返回“空字符串文件名”来表示空目录,空目录至少会有:
.
..
. 和 ..)如果你看到:
while ((entry = readdir(dir)) != NULL) {
// 什么都没打印
}
但目录真的是空的,那说明:
✅ 正常现象
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return;
}
如果:
opendir 会返回 NULL,但你却仍然调用了 readdir,这是未定义行为,可能表现为“一直返回 NULL”。
✅ 检查:
ls -ld /some/path
opendir("test.txt");
如果 test.txt 是普通文件:
opendir 返回 NULL✅ 用 stat 检查:
struct stat st;
stat(path, &st);
if (!S_ISDIR(st.st_mode)) {
printf("不是目录\n");
}
即使 opendir 成功:
会导致:
readdir 返回 NULLerrno == EACCES✅ 检查:
ls -l 目录父路径
d_name 但没打印错误示例:
while ((entry = readdir(dir)) != NULL) {
// 忘了 printf
}
或:
if (entry->d_name == "") // 错误判断
✅ 正确用法:
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
例如:
表现:
opendir 成功readdir 立即返回 NULLerrno == ENOENT 或 ENOTCONN如果:
可能导致:
readdir 提前返回 NULLerrno != 0#include <dirent.h>
#include <stdio.h>
#include <errno.h>
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return;
}
struct dirent *entry;
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
✅ 目录存在吗?
✅ 是目录吗?
✅ 有读+执行权限吗?
✅ opendir 成功了吗?
✅ readdir 返回 NULL 时 errno 是多少?
✅ 目录里真的有文件吗?
如果你愿意,可以把:
readdir 代码片段ls -l 目录errno 值发出来,我可以直接帮你定位是哪一条原因。