温馨提示×

linux readdir有何作用

小樊
42
2026-10-14 11:32:08
栏目: 智能运维

在 Linux 中,readdir 是用于读取目录内容的函数,常见于 C 语言编程(POSIX 标准)。它的主要作用是:遍历一个已经打开的目录,逐个获取目录中的文件和子目录信息。


一、readdir 的基本作用

readdir 用来:

  • 打开目录后,按顺序读取目录项(directory entry)
  • 每次调用返回一个目录项(如文件名)
  • 直到目录结束返回 NULL

它只能读取文件名,不能读取文件内容或详细属性(如大小、权限),如果需要详细信息,还要配合 stat。


二、函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

参数

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

返回值

  • 成功:指向 struct dirent 的指针
  • 失败或目录结束:返回 NULL

三、struct dirent 常用成员

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

⚠️ 不同系统字段可能略有差异


四、典型使用流程

#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;
}

输出示例:

.
..
main.c
test.txt
subdir

五、常见注意点

1. 会读到 . 和 ..

  • . 表示当前目录
  • .. 表示上级目录

通常需要过滤:

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

2. readdir 不是线程安全的

  • 线程安全版本:readdir_r(已逐渐废弃)
  • 现代推荐:使用 readdir + 单线程或加锁

3. 只能读文件名

想要文件大小、权限、修改时间:

stat(entry->d_name, &sb);

六、相关函数对比

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

七、一句话总结

readdir 的作用就是:在 Linux 中遍历目录,逐个获取目录里的文件名(目录项)。

如果你愿意,我也可以讲:

  • readdir vs getdents
  • 如何用 readdir 实现 ls
  • 递归遍历目录示例

0 踩