温馨提示×

linux readdir可以递归子目录吗

小樊
46
2026-10-17 07:33:48
栏目: 智能运维

简短结论:readdir 本身不能递归子目录,只能读取“当前目录”里的条目。

详细解释

在 Linux(POSIX)中:

  • opendir():打开一个目录
  • readdir():逐个读取该目录下的条目(文件 / 子目录 / 符号链接等)
  • closedir():关闭目录

readdir 只会返回当前目录的内容,不会自动进入子目录。

如何实现递归?

你需要自己判断:

  • 如果 readdir 返回的 d_type == DT_DIR(或 stat 显示是目录)
  • 并且不是 . 和 ..
  • 就再次 opendir + readdir

示例逻辑(C 伪代码):

void list_dir(const char *path) {
    DIR *dir = opendir(path);
    struct dirent *entry;

    while ((entry = readdir(dir)) != NULL) {
        if (strcmp(entry->d_name, ".") == 0 ||
            strcmp(entry->d_name, "..") == 0)
            continue;

        printf("%s/%s\n", path, entry->d_name);

        if (entry->d_type == DT_DIR) {
            char sub[512];
            snprintf(sub, sizeof(sub), "%s/%s", path, entry->d_name);
            list_dir(sub); // 递归
        }
    }
    closedir(dir);
}

补充

  • readdir 不是线程安全的(可用 readdir_r,已逐步废弃)
  • 更简单方式:
    • ftw() / nftw()(标准库自带递归)
    • find 命令
    • glob()(有限递归)

如果你愿意,我可以给你完整可编译的 C 示例或对比 readdir vs nftw。

0 踩