温馨提示×

debian readdir怎么使用

小樊
45
2026-09-16 12:37:03
栏目: 智能运维

在 Debian(以及其它 Linux 系统)上,readdirC 语言中用于读取目录内容的函数,定义在 <dirent.h> 中。下面从基本概念 → 使用示例 → 常见问题给你讲清楚。


一、readdir 是什么

readdir 用来逐个读取目录中的文件和子目录

函数原型:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
  • dirp:由 opendir() 返回的目录流指针
  • 返回值:
    • 成功:指向 struct dirent 的指针
    • 到达目录末尾或出错:返回 NULL

二、基本使用流程

1️⃣ 打开目录(opendir)

2️⃣ 循环读取(readdir)

3️⃣ 关闭目录(closedir)


三、完整示例(C 语言)

示例:列出当前目录下的所有文件

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

int main() {
    DIR *dir;
    struct dirent *entry;

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

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

    closedir(dir);
    return 0;
}

四、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_name:文件名(最常用)
  • d_type
    • DT_REG:普通文件
    • DT_DIR:目录
    • DT_LNK:符号链接

五、只列出普通文件(示例)

while ((entry = readdir(dir)) != NULL) {
    if (entry->d_type == DT_REG) {
        printf("文件: %s\n", entry->d_name);
    }
}

六、去除 ...

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

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

七、编译方式(Debian)

gcc readdir_example.c -o readdir_example
./readdir_example

八、常见问题

❓ readdir 和 readdir_r 的区别?

  • readdir:非线程安全
  • readdir_r:线程安全(已逐步废弃,推荐用 readdir + 锁)

❓ 可以用 C++ 吗?

可以,但更推荐:

  • std::filesystem::directory_iterator(C++17)

❓ 能递归遍历目录吗?

可以,在 DT_DIR 时递归调用 opendir/readdir


如果你想要:

  • ✅ 递归列出目录
  • ✅ 用 C++ 写
  • ✅ 按文件类型/大小过滤
  • ✅ 在 shell / Python 中替代方案

告诉我,我可以直接给你代码。

0