温馨提示×

linux readdir是什么

小樊
37
2026-09-02 15:05:09
栏目: 智能运维

在 Linux 中,readdir 是一个用于读取目录内容的函数(也可以泛指相关系统调用/库函数),常见于 C 语言编程和 Linux 文件系统操作中。


一、readdir 是什么?

readdirPOSIX 标准定义的目录读取函数,用来逐个读取一个打开目录中的文件和子目录

它通常和下面这组函数配合使用:

  • opendir():打开目录
  • readdir():读取目录项
  • closedir():关闭目录

二、基本用法(C 语言)

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

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

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

    closedir(dir);
    return 0;
}

执行流程

  1. opendir(".") 打开当前目录
  2. readdir() 每次返回一个目录项
  3. 返回 NULL 表示读取结束

三、readdir 返回什么?

readdir 返回一个指向 struct dirent 的指针:

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

最常用的是:

entry->d_name

四、常见的 readdir 变体

函数 说明
readdir() 基础版本(非线程安全)
readdir_r() 线程安全版本(已不推荐)
readdir64() 支持大文件系统

五、Shell 中“类似 readdir”的命令

如果你不是写 C 程序,而是用命令行:

ls

底层其实也会调用类似 readdir 的系统接口。

查看系统调用:

strace ls

你可能会看到:

getdents64(...)

getdents / getdents64 是 Linux 的系统调用 readdir 是 C 库封装


六、常见注意点

1. 会读到 ...

.
..
file1
file2

需要自己过滤:

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

2. 不是递归的

readdir 只读取当前目录,不会进入子目录。


七、一句话总结

readdir 是 Linux/C 中用于读取目录中文件列表的函数,相当于程序里的 ls

如果你愿意,我也可以:

  • 给你一个递归遍历目录的例子
  • 对比 readdirscandir
  • 内核层的 getdents 原理

你想深入哪一块?

0