温馨提示×

linux readdir能递归吗

小樊
41
2026-09-08 15:36:29
栏目: 智能运维

简短结论:Linux 的 readdir() 本身不能递归,它只能读取一个目录下的条目(不进入子目录)。

1. readdir() 是什么

  • readdir() 是 POSIX / glibc 提供的函数
  • 配合 opendir() / closedir() 使用
  • 每次调用返回一个目录项(struct dirent *
  • 只针对已打开的那个目录

示例:

DIR *dir = opendir("/path");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    // 只列出 /path 下的直接内容
}
closedir(dir);

2. 如何实现“递归遍历目录”

需要你自己写递归逻辑

  • readdir() 读取目录
  • 对每个条目用 stat() / lstat() 判断是否是目录
  • 如果是目录,就再次 opendir() + readdir()

示例(简化):

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;

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

        struct stat st;
        lstat(full, &st);

        if (S_ISDIR(st.st_mode)) {
            list_dir(full);  // 递归
        } else {
            printf("%s\n", full);
        }
    }
    closedir(dir);
}

3. 更简单的方式

  • Shellfind /path
  • C 高层封装nftw()(更推荐做递归遍历)
  • C++17+std::filesystem::recursive_directory_iterator

总结

问题 答案
readdir() 能递归吗 ❌ 不能
能靠它实现递归吗 ✅ 可以(自己写)
有现成递归函数吗 nftw()

如果你愿意,我可以给你一个完整可编译的递归目录遍历 C 程序

0