在 Linux 下使用 readdir() 读不到文件,通常不是“文件不存在”,而是用法或环境问题。下面按最常见原因逐一说明,并给出排查方法。
opendir() 失败但没检查返回值DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return;
}
✅ 如果路径不存在 / 权限不足,readdir() 永远读不到。
opendir("test"); // 相对当前进程工作目录
如果你在别的目录运行程序,就会“读不到”。
✅ 解决:
pwd
ls test
或直接使用绝对路径:
opendir("/home/user/test");
. 和 ..,误以为没文件readdir() 一定会返回:
.
..
很多人误以为“没文件”。
✅ 正确过滤:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
ls -a /path
确认是否真的有文件。
r 权限ls -ld /path
strace ./your_program
opendir("link");
如果 link 指向不存在目录,也会失败。
✅ 用 opendir(realpath(...)) 或 stat() 检查。
readdir_r() 但 buffer 用错(已废弃)不推荐使用 readdir_r,容易踩坑。
✅ 直接用 readdir() 即可(线程安全场景另说)。
readdir() 不会递归子目录。
✅ 需要自己递归:
if (entry->d_type == DT_DIR) {
// 递归
}
#include <dirent.h>
#include <stdio.h>
#include <string.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
continue;
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
opendir() 返回值是否为 NULL. 和 ..如果你愿意,可以把:
贴出来,我可以直接帮你定位是哪一条。