在 Linux 中,readdir 是一个用于读取目录内容的函数(也可以泛指相关系统调用/库函数),常见于 C 语言编程和 Linux 文件系统操作中。
readdir 是什么?readdir 是 POSIX 标准定义的目录读取函数,用来逐个读取一个打开目录中的文件和子目录。
它通常和下面这组函数配合使用:
opendir():打开目录readdir():读取目录项closedir():关闭目录#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;
}
opendir(".") 打开当前目录readdir() 每次返回一个目录项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() |
支持大文件系统 |
如果你不是写 C 程序,而是用命令行:
ls
底层其实也会调用类似 readdir 的系统接口。
查看系统调用:
strace ls
你可能会看到:
getdents64(...)
getdents/getdents64是 Linux 的系统调用readdir是 C 库封装
. 和 ...
..
file1
file2
需要自己过滤:
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
readdir 只读取当前目录,不会进入子目录。
readdir是 Linux/C 中用于读取目录中文件列表的函数,相当于程序里的ls。
如果你愿意,我也可以:
readdir 和 scandirgetdents 原理你想深入哪一块?