温馨提示×

debian readdir能递归吗

小樊
41
2026-07-13 19:13:27
栏目: 智能运维

Debian(以及所有 Linux)里,readdir 本身是不能递归的

结论先说

  • readdir 只能读取一个目录里的直接内容
  • 不会自动进入子目录
  • 递归需要你自己写代码实现

1. readdir 是什么

readdir 是 POSIX 标准 C 库函数,用来读取 一个已经打开的目录流(DIR*) 中的目录项。

#include <dirent.h>

DIR *dir = opendir(".");
struct dirent *entry;

while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}

closedir(dir);

它只会返回:

  • 当前目录下的文件
  • 当前目录下的子目录
  • ...

不会自动进入子目录


2. 为什么不能递归

readdir 的设计目标是:

一次只处理一层目录

如果需要递归,你必须:

  1. 判断 entry->d_type == DT_DIR
  2. 排除 ...
  3. 对子目录再次调用 opendir + readdir

3. C 语言递归 readdir 示例(Debian / Linux)

#include <stdio.h>
#include <dirent.h>
#include <string.h>

void list_dir(const char *path) {
    DIR *dir = opendir(path);
    if (!dir) return;

    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 newpath[1024];
            snprintf(newpath, sizeof(newpath), "%s/%s", path, entry->d_name);
            list_dir(newpath);  // 递归
        }
    }
    closedir(dir);
}

int main() {
    list_dir(".");
    return 0;
}

4. 常见误区

❌ 以为 readdir 能像 find 一样递归

find . -type f

这是 用户态工具,内部也是递归实现的。

d_type 一定可靠?

在部分文件系统(如某些 NFS)上:

entry->d_type == DT_UNKNOWN

这时需要用 lstat() 判断类型。


5. 如果你不想自己递归

nftw(推荐)

#include <ftw.h>

int fn(const char *path, const struct stat *sb, int type, struct FTW *ftwbuf) {
    printf("%s\n", path);
    return 0;
}

int main() {
    nftw(".", fn, 20, FTW_PHYS);
}

✅ 自动递归
✅ Debian 自带
✅ 比手写 readdir 安全


6. 总结

问题 答案
readdir 能递归吗 ❌ 不能
需要递归怎么办 ✅ 自己递归 / 用 nftw
Debian 是否支持 ✅ 完全支持

如果你愿意,可以告诉我:

  • 你用的是 C / C++ / Python / shell
  • 是否要 过滤文件类型 / 处理符号链接

我可以给你最合适的示例。

0