温馨提示×

Debian readdir有何作用

小樊
42
2026-08-12 06:58:57
栏目: 智能运维

在 Debian(以及所有 Linux 和 POSIX 系统)中,readdir 并不是 Debian 独有的功能,而是 C 标准库(glibc)和 Linux 系统编程接口的一部分,用于读取目录内容

下面从「是什么、干什么、怎么用、常见注意点」几个方面说明。


1. readdir 是什么?

readdir 是一个 C 语言函数,用来遍历(读取)一个目录中的文件和子目录

头文件:

#include <dirent.h>

函数原型:

struct dirent *readdir(DIR *dirp);

2. readdir 的作用

作用一句话概括:

从已打开的目录流中,逐个读取目录项(文件名、inode 等信息)。

典型用途:

  • 列出目录下的所有文件
  • 实现 ls 类似功能
  • 扫描目录内容(例如日志、配置目录)

3. 基本使用流程

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

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

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

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

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

    closedir(dir);
    return 0;
}

执行流程说明

  1. opendir():打开目录,返回 DIR*
  2. readdir()
    • 每次调用返回 一个目录项
    • 返回 NULL 表示结束
  3. closedir():关闭目录

4. struct dirent 里有什么?

常用字段:

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

⚠️ 注意:

  • d_type 不是所有文件系统都可靠
  • 判断文件类型更稳妥的方式是 lstat()

5. readdir 在 Debian 上的特点

  • Debian 使用 glibc
  • readdir线程不安全
  • 对应的线程安全版本:
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

⚠️ readdir_r 已被 官方标记为 deprecated,不推荐使用。


6. 常见误区

❌ 误区 1:readdir 会返回完整路径

readdir() 只返回文件名,不是 /path/to/file

你需要自己拼接:

snprintf(path, sizeof(path), "%s/%s", dirname, entry->d_name);

❌ 误区 2:... 不会返回

readdir 会返回 "."".."

通常需要手动过滤。


7. 与 shell 命令的关系

Shell 命令 系统调用 / 函数
ls opendir + readdir
find readdir + stat
rm -r readdir + unlink/rmdir

8. 总结一句话

readdir 在 Debian(Linux)中用于程序化地读取目录内容,是系统编程中遍历目录的核心接口。

如果你愿意,我可以:

  • 给你一个 递归遍历目录的完整示例
  • 对比 readdir vs scandir
  • 解释 readdir 的内部实现(getdents 系统调用)
  • 结合 Debian 包管理或实际运维场景说明用法

你更想了解哪一部分?

0