在 Debian 下 readdir() 返回为空(或读不到目录项),通常不是 Debian 本身的问题,而是目录状态、权限或调用方式的问题。下面按常见原因逐一排查。
直接用 shell 确认:
ls -a /path/to/dir
如果只有 . 和 ..,那 readdir() 本来就应该只读到这两个(如果你过滤掉了,就会“看起来为空”)。
readdir() 需要:
检查:
ls -ld /path/to/dir
例如:
drw-r--r-- ← 没有 x,readdir 会失败或无内容
drwxr-xr-x ← 正常
修正:
chmod +x /path/to/dir
⚠️ 注意:
readdir() root 的目录,除非有权限例如:
mount | grep /path/to/dir
如果:
readdir() 就会返回空。
很多示例代码会这样写:
while ((entry = readdir(dir))) {
if (entry->d_name[0] == '.')
continue;
}
这会过滤掉:
...如果目录里只有隐藏文件,就会“看起来为空”。
✅ 正确测试方式:
不要过滤,直接打印所有 d_name
opendir() 是否成功DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return;
}
如果 opendir() 失败,readdir() 当然为空。
常见错误:
chdir 后失效/建议:
realpath(path, resolved);
Debian 一般没问题,但如果你:
readdir / readdir64可能出问题。
✅ 建议使用:
readdir()
而不是 readdir64 除非你明确需要。
在以下环境中:
目录可能:
测试:
ls -a /path/to/dir
stat /path/to/dir
极少见,但可能:
dmesg | tail
如果有 ext4 / xfs 错误,尝试:
fsck
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir))) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
ls -a 能看到内容吗?opendir() 有没有失败?. 和 ..?如果你愿意,可以把:
一起贴出来,我可以直接帮你定位是哪一条导致的。