温馨提示×

debian readdir如何使用

小樊
39
2026-10-16 01:46:27
栏目: 智能运维

在 Debian(以及其它 Linux 发行版)里,readdir 通常指的是 C 语言中的 readdir() 函数,用于读取目录内容。下面从「是什么、怎么用、示例、常见问题」几个方面说明。


一、readdir 是什么

readdir() 是 POSIX 标准提供的目录读取函数,定义在:

#include <dirent.h>

函数原型:

struct dirent *readdir(DIR *dirp);
  • DIR *dirp:由 opendir() 打开的目录流
  • 返回值:
    • 成功:指向 struct dirent 的指针
    • 失败或读到目录末尾:返回 NULL

二、基本使用流程

opendir()   // 打开目录
  ↓
readdir()   // 循环读取目录项
  ↓
closedir()  // 关闭目录

三、简单示例(C 语言)

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

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

int main(void) {
    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;
}

编译(Debian)

gcc readdir_example.c -o readdir_example
./readdir_example

四、struct dirent 常用字段

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

判断文件类型(d_type)

if (entry->d_type == DT_DIR) {
    printf("%s 是目录\n", entry->d_name);
}

常见类型:

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

五、过滤 . 和 ..

if (strcmp(entry->d_name, ".") == 0 ||
    strcmp(entry->d_name, "..") == 0)
    continue;

六、线程安全问题(重要)

readdir() 不是线程安全的。

线程安全版本:

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

不过在较新 glibc 中,readdir_r 已被标记为废弃,推荐:

  • 单线程使用 readdir
  • 多线程加锁
  • 或使用 scandir

七、相关函数对比

函数 说明
opendir 打开目录
readdir 读取一项
closedir 关闭目录
scandir 读取并排序/过滤
telldir / seekdir 定位目录位置

八、如果你指的是“命令”

Debian 没有 readdir 命令,它是系统调用 / C 函数。

如果你只是想列目录:

ls
ls -a

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

  • 你是用 C / C++ / Python / Shell?
  • 还是想了解 内核 readdir / getdents?

我可以直接给你对应示例。

0 踩