温馨提示×

linux readdir会读子目录吗

小樊
41
2026-10-14 11:35:10
栏目: 智能运维

简短结论:readdir 本身不会递归读取子目录,它只读取“当前目录”里的条目(包括子目录项,但不会进入子目录去读)。

下面详细说明:


1. readdir 做什么

在 Linux / POSIX 中:

#include <dirent.h>

DIR *opendir(const char *path);
struct dirent *readdir(DIR *dirp);
  • opendir:打开一个目录
  • readdir:一次返回一个目录项(struct dirent)
  • 这些目录项包括:
    • 普通文件
    • 子目录(类型为 DT_DIR)
    • 符号链接
    • 其他类型

⚠️ 关键点:
readdir 只读取该目录本身的内容列表,并不会自动进入子目录。


2. 子目录在 readdir 中如何出现

子目录在 readdir 的结果中,只是一个条目:

/test
 ├── a.txt
 ├── subdir/   <-- readdir 会读到这个名字
 └── b.log

readdir 会返回:

  • a.txt
  • subdir(类型是目录)
  • b.log

但不会返回:

subdir/file1
subdir/file2

3. 如何“读取子目录里的内容”

如果你想读子目录,需要:

if (entry->d_type == DT_DIR) {
    // 跳过 . 和 ..
    if (strcmp(entry->d_name, ".") == 0 ||
        strcmp(entry->d_name, "..") == 0)
        continue;

    char path[PATH_MAX];
    snprintf(path, sizeof(path), "%s/%s", dir_path, entry->d_name);

    DIR *subdir = opendir(path);
    // 再对 subdir 调用 readdir
}

也就是:自己递归调用 opendir + readdir


4. 常见误解

误解 事实
readdir 会自动遍历整个目录树 ❌ 不会
readdir 返回的文件包含子目录内文件 ❌ 不包含
子目录在 readdir 中不可见 ❌ 可见,但只是名字

5. 如果你想要“递归读取”

可选方案:

  • 自己写递归函数
  • 使用 fts()(fts_open / fts_read)
  • 使用 nftw()(目录树遍历)
  • Shell 中:find

如果你是想问 某个具体语言(如 Python / C++ / Shell)里的 readdir 行为,或者 性能 / 深度限制问题,可以继续问。

0 踩