温馨提示×

ubuntu readdir为何返回空

小樊
50
2026-10-21 03:57:07
栏目: 智能运维

在 Ubuntu(Linux)下 readdir 返回“空”或“好像没内容”,通常不是 readdir 本身坏了,而是使用方式或目录状态的问题。下面按最常见原因逐一说明。


一、最常见原因:没有先 opendir

DIR *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 可能:

  • 返回 NULL
  • 或只返回部分条目

解决

ls -ld /path
sudo chmod +rx /path

四、你只看了一个 entry 就停了

错误示例:

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

✅ 建议用绝对路径测试。


七、在 chroot / 容器 / snap 中

Ubuntu 常见场景:

  • Docker
  • snap 应用
  • chroot

目录在你的视角“存在”,但在程序视角不存在。


八、readdir 返回 NULL 不代表空目录

⚠️ 重要区别:

情况 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;
}

如果你愿意,我可以更精确地帮你定位

你可以贴出:

  1. 你的 readdir 代码
  2. 目录路径
  3. Ubuntu 版本
  4. 是否 root / 容器 / snap

我可以直接告诉你是哪一条原因。

0 踩