温馨提示×

linux readdir为何读不到文件

小樊
37
2026-09-14 19:01:39
栏目: 智能运维

在 Linux 下使用 readdir() 读不到文件,通常不是“文件不存在”,而是用法或环境问题。下面按最常见原因逐一说明,并给出排查方法。


一、最常见原因汇总

1️⃣ opendir() 失败但没检查返回值

DIR *dir = opendir("/some/path");
if (!dir) {
    perror("opendir");
    return;
}

✅ 如果路径不存在 / 权限不足,readdir() 永远读不到。


2️⃣ 目录路径写错(相对路径问题)

opendir("test"); // 相对当前进程工作目录

如果你在别的目录运行程序,就会“读不到”。

✅ 解决:

pwd
ls test

或直接使用绝对路径:

opendir("/home/user/test");

3️⃣ 只读到 ...,误以为没文件

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);
}

4️⃣ 目录是空的(真的没文件)

ls -a /path

确认是否真的有文件。


5️⃣ 权限不足(最常见“隐形”原因)

  • 目录无 r 权限
  • 在容器 / chroot / 挂载目录中
ls -ld /path
strace ./your_program

6️⃣ 读取的是符号链接指向的目录

opendir("link");

如果 link 指向不存在目录,也会失败。

✅ 用 opendir(realpath(...))stat() 检查。


7️⃣ 用的是 readdir_r() 但 buffer 用错(已废弃)

不推荐使用 readdir_r,容易踩坑。

✅ 直接用 readdir() 即可(线程安全场景另说)。


8️⃣ 文件在子目录,而你只读了一次

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
  • [ ] 路径是否绝对路径
  • [ ] 是否忽略 ...
  • [ ] 目录是否真的有文件
  • [ ] 是否有读权限
  • [ ] 是否在容器 / 挂载点 / chroot

如果你愿意,可以把:

  • 你的 代码片段
  • 运行环境(普通 Linux / Docker / WSL)

贴出来,我可以直接帮你定位是哪一条。

0