在 Ubuntu(Linux)下 readdir 返回“空”或“好像没内容”,通常不是 readdir 本身坏了,而是使用方式或目录状态的问题。下面按最常见原因逐一说明。
opendirDIR *dir = opendir("/some/path");
if (!dir) { perror("opendir"); return; }
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
✅ 如果 opendir 失败,readdir 会立即返回 NULL,看起来就像“目录为空”。
if (dir == NULL) {
perror("opendir");
}
某些目录在 Ubuntu 上看起来有文件,其实没有:
/proc/<pid>/ 某些子目录mkdir)ls -la /your/path
即使 ls 能看到:
ls: cannot open directory '.': Permission denied
opendir 会成功,但 readdir 可能:
ls -ld /path
sudo chmod +rx /path
错误示例:
struct dirent *e = readdir(dir);
printf("%s\n", e->d_name); // 只读了一次
✅ 必须用 while 循环。
. 和 .. 被误认为是“空”readdir 一定会返回:
.
..
如果你只过滤掉了它们:
if (strcmp(entry->d_name, ".") == 0) continue;
if (strcmp(entry->d_name, "..") == 0) continue;
然后目录里只有这两个,就会“看起来什么都没有”。
opendir("logs"); // 当前工作目录下的 logs
如果程序是从别的地方启动的:
pwd
✅ 建议用绝对路径测试。
Ubuntu 常见场景:
目录在你的视角“存在”,但在程序视角不存在。
⚠️ 重要区别:
| 情况 | readdir 返回值 |
|---|---|
| 目录结束 | NULL |
| 出错 | NULL |
errno = 0;
entry = readdir(dir);
if (entry == NULL && errno != 0) {
perror("readdir");
}
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *e;
while ((e = readdir(dir)) != NULL) {
printf("%s\n", e->d_name);
}
closedir(dir);
return 0;
}
你可以贴出:
readdir 代码我可以直接告诉你是哪一条原因。