在 Debian(以及所有 Linux 和 POSIX 系统)中,readdir 并不是 Debian 独有的功能,而是 C 标准库(glibc)和 Linux 系统编程接口的一部分,用于读取目录内容。
下面从「是什么、干什么、怎么用、常见注意点」几个方面说明。
readdir 是什么?readdir 是一个 C 语言函数,用来遍历(读取)一个目录中的文件和子目录。
头文件:
#include <dirent.h>
函数原型:
struct dirent *readdir(DIR *dirp);
readdir 的作用作用一句话概括:
从已打开的目录流中,逐个读取目录项(文件名、inode 等信息)。
典型用途:
ls 类似功能#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;
}
opendir():打开目录,返回 DIR*readdir():
NULL 表示结束closedir():关闭目录struct dirent 里有什么?常用字段:
struct dirent {
ino_t d_ino; // inode 号
off_t d_off; // 偏移
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型(DT_REG / DT_DIR)
char d_name[256]; // 文件名
};
⚠️ 注意:
d_type 不是所有文件系统都可靠lstat()readdir 在 Debian 上的特点readdir 是 线程不安全 的int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
⚠️ readdir_r 已被 官方标记为 deprecated,不推荐使用。
readdir 会返回完整路径readdir() 只返回文件名,不是 /path/to/file
你需要自己拼接:
snprintf(path, sizeof(path), "%s/%s", dirname, entry->d_name);
. 和 .. 不会返回readdir 会返回 "." 和 ".."
通常需要手动过滤。
| Shell 命令 | 系统调用 / 函数 |
|---|---|
ls |
opendir + readdir |
find |
readdir + stat |
rm -r |
readdir + unlink/rmdir |
readdir在 Debian(Linux)中用于程序化地读取目录内容,是系统编程中遍历目录的核心接口。
如果你愿意,我可以:
readdir vs scandirreaddir 的内部实现(getdents 系统调用)你更想了解哪一部分?