在 Ubuntu(Linux)下,readdir 报错通常和用法、目录句柄、权限或环境有关。下面按“最常见原因 → 解释 → 解决办法”来说明。
readdir 是什么readdir 是 POSIX 标准函数,用来读取目录内容:
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
opendir错误示例:
DIR *dir;
readdir(dir); // dir 未初始化
✅ 正确:
DIR *dir = opendir("/path");
if (!dir) {
perror("opendir");
return -1;
}
opendir 失败(最常见)readdir 返回 NULL 不代表一定是 readdir 错,往往是 opendir 就失败了。
常见原因:
检查方式:
perror("opendir");
Ubuntu 常见错误:
Permission denied
No such file or directory
Not a directory
readdir 返回值当错误很多人误以为:
if (!readdir(dir)) {
// 错误
}
❌ 这是错误的
readdir 返回 NULL 表示:
✅ 正确判断方式:
errno = 0;
struct dirent *entry = readdir(dir);
if (!entry) {
if (errno != 0) {
perror("readdir");
}
}
在 Ubuntu 上:
rm -rf会导致:
EBADF
ENOENT
解决:
/mnt、/media 等易变路径DIR*readdir 不是线程安全的(Ubuntu 默认)
❌ 错误:
// 多个线程共用同一个 dir
readdir(dir);
✅ 解决:
opendirreaddir_r(已废弃但仍可用)比如:
std::filesystemreaddir容易:
建议:
opendir/readdir/closedirstd::filesystem::directory_iterator缺少:
#include <dirent.h>
#include <errno.h>
可能表现:
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
errno = 0;
struct dirent *ent;
while ((ent = readdir(dir)) != NULL) {
printf("%s\n", ent->d_name);
}
if (errno != 0)
perror("readdir");
closedir(dir);
return 0;
}
你可以贴:
我可以直接指出是哪一行导致 readdir 报错。