在 Ubuntu(Linux)下,readdir 返回“空值”或“看起来没东西”,通常不是函数本身出错,而是使用方式或环境理解有误。下面按常见原因逐一说明。
readdir 返回的是 NULL 的正常情况readdir 读到目录末尾就会返回 NULL,这是正常行为,不是错误。
DIR *dir = opendir("/some/dir");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
// 最后 readdir 返回 NULL,表示结束
✅ 解读:
NULL ≠ 目录为空NULL 可能是:
opendir 失败(但这时 dir == NULL)如果目录中没有任何文件(包括隐藏文件):
ls -a /empty_dir
输出只有:
. ..
那么 readdir 会:
...NULL如果你只看到“空”,可能是因为:
. 和 ..NULL 表示“没文件”opendir 失败但你没检查常见错误代码:
DIR *dir = opendir("/path");
readdir(dir); // dir 可能是 NULL
如果:
opendir 返回 NULL,这时 readdir 行为是未定义或立即返回 NULL
✅ 正确写法:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return;
}
opendir("test");
实际取决于当前工作目录
检查:
system("pwd");
工作目录可能是 / 或 /tmp
Ubuntu 下:
/root/var/lib普通用户无法读取:
ls -ld /some/dir
如果权限是:
drwx------ root root
你的程序读到的就是“空”或失败
opendir("/etc/passwd"); // 错
结果:
opendir 返回 NULLreaddir 异常✅ 只能是目录
readdir 不是线程安全函数
多线程中应使用:
readdir_r
(或 C 库较新版本中的 readdir + 锁)
例如:
表现:
opendir 成功readdir 很快返回 NULL检查:
mount | grep your_path
df -h
#include <dirent.h>
#include <stdio.h>
int main() {
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);
return 0;
}
if (readdir(dir) == NULL && errno != 0) {
perror("readdir");
}
但注意:
如果你愿意,可以把:
发出来,我可以精确告诉你为什么返回空。