温馨提示×

linux readdir是什么函数

小樊
49
2026-09-20 22:28:28
栏目: 智能运维

readdir 是 Linux / UNIX 系统中用于读取目录内容的一个标准库函数,定义在 <dirent.h> 头文件中,通常配合 opendir、closedir 一起使用。


一、函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

参数

  • dirp:由 opendir() 返回的目录流指针(DIR *)

返回值

  • 成功:指向 struct dirent 的指针(表示读到的目录项)
  • 失败或到达目录末尾:返回 NULL

⚠️ 到达目录末尾和出错都返回 NULL,需要结合 errno 判断


二、相关结构体

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:文件名(如 "test.txt")
  • d_type:文件类型(如 DT_REG 普通文件,DT_DIR 目录)

三、典型用法示例

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

int main() {
    DIR *dir = opendir(".");
    if (!dir) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

四、常见注意点

  1. 会包含 . 和 ..

    if (strcmp(entry->d_name, ".") == 0 ||
        strcmp(entry->d_name, "..") == 0)
        continue;
    
  2. 不是线程安全的

    • 线程安全版本:readdir_r(已不推荐)
    • 现代推荐:使用 readdir + 单线程或加锁
  3. 只读取目录项,不递归

    • 要遍历子目录需自己递归调用

五、相关函数对比

函数 作用
opendir 打开目录
readdir 读取一个目录项
closedir 关闭目录
scandir 一次性读取并排序
getdents 更底层的系统调用

如果你愿意,我可以:

  • 给你一个 递归遍历目录的例子
  • 解释 readdir 和 stat 的区别
  • 讲 readdir 在内核里是怎么实现的

0 踩