温馨提示×

debian readdir如何递归遍历

小樊
41
2026-09-07 10:42:37
栏目: 智能运维

在 Debian(其实就是 Linux,C/C++ 环境)下,readdir 本身只能读一个目录,要“递归遍历”需要自己写递归函数。下面给你几种常见做法。


一、使用 readdir + 递归(最基础方式)

核心思路

  1. opendir 打开目录
  2. readdir 读取每一项
  3. 如果是目录(DT_DIR),且不是 ...,就递归调用
  4. 如果是文件,就处理

示例代码(C 语言)

#define _GNU_SOURCE
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

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

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

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

        if (entry->d_type == DT_DIR) {
            printf("DIR : %s\n", fullpath);
            list_dir(fullpath);   // 递归
        } else {
            printf("FILE: %s\n", fullpath);
        }
    }

    closedir(dir);
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <dir>\n", argv[0]);
        return 1;
    }
    list_dir(argv[1]);
    return 0;
}

编译

gcc rec_readdir.c -o rec_readdir
./rec_readdir /path/to/dir

二、更稳妥的方式(用 stat 判断目录)

d_type 有时不可靠(某些文件系统),推荐用 stat

struct stat st;
stat(fullpath, &st);
if (S_ISDIR(st.st_mode)) {
    list_dir(fullpath);
}

三、不递归的方式(用栈或队列)

如果目录非常深,递归可能栈溢出,可以用:

  • 手动栈(DFS)
  • 队列(BFS)

但一般 readdir + 递归 够用。


四、如果你不想自己写(现成工具)

命令行

find /path

C 高层封装

  • fts_open() / fts_read()(推荐,标准库)
  • nftw()(更专业,支持回调)

五、总结

readdir 不能递归
递归是你在代码里实现的
DT_DIR 或 stat 判断目录
跳过 ...

如果你需要:

  • 只遍历某种文件
  • 限制深度
  • 多线程遍历
  • 用 C++ / Rust / Python

可以告诉我,我可以直接给你对应版本。

0