温馨提示×

debian readdir如何遍历目录

小樊
45
2026-09-19 12:14:47
栏目: 智能运维

在 Debian(或者说 Linux 下,使用 C 语言)中,遍历目录通常使用 opendir / readdir / closedir 这一系列函数,它们来自 <dirent.h>。

下面给你一个完整示例 + 说明。


一、基本流程

  1. opendir() 打开目录
  2. readdir() 逐个读取目录项
  3. closedir() 关闭目录

二、最简单的遍历目录示例(C 语言)

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

int main(int argc, char *argv[]) {
    const char *path = argc > 1 ? argv[1] : ".";
    DIR *dir = opendir(path);

    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

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

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

    closedir(dir);
    return 0;
}

编译运行:

gcc readdir_example.c -o readdir_example
./readdir_example /etc

三、struct dirent 关键字段

struct dirent {
    ino_t          d_ino;      // inode 号
    off_t          d_off;      // 偏移
    unsigned short d_reclen;   // 记录长度
    unsigned char  d_type;     // 文件类型
    char           d_name[256];// 文件名
};

d_type 常用值

DT_REG  // 普通文件
DT_DIR  // 目录
DT_LNK  // 符号链接

示例判断目录:

if (entry->d_type == DT_DIR) {
    printf("[DIR] %s\n", entry->d_name);
}

⚠️ 注意:d_type 在某些文件系统(如某些网络文件系统)上可能为 DT_UNKNOWN


四、递归遍历目录(常用)

#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) 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);

        printf("%s\n", fullpath);

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

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

五、Shell 中遍历目录(非 C)

如果你不是写 C 程序,而是用 shell:

for f in /etc/*; do
    echo "$f"
done

或:

find /etc -maxdepth 1

六、常见问题

1. readdir 是线程安全的吗?

  • ❌ readdir 不是线程安全的
  • ✅ 用 readdir_r(旧)或 readdir + 加锁

2. 需要头文件

#include <dirent.h>
#include <sys/types.h>

如果你是想:

  • ✅ 写 C/C++ 程序
  • ✅ 用 Python / Shell
  • ✅ 实现 特定功能(如过滤文件)

可以告诉我,我可以给你更具体的示例。

0 踩