readdir 是 Linux 中用于读取目录内容的函数,常见于 C 语言编程。它不是 shell 命令,而是 POSIX 标准库函数,定义在 <dirent.h> 中。
下面分几种常见用法说明。
readdir 用来遍历一个目录里的文件和子目录,类似于 ls 命令的内部实现方式。
#include <dirent.h>
#include <stdio.h>
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir("."); // 打开当前目录
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
opendirDIR *opendir(const char *name);
打开目录,返回目录流指针。
readdirstruct dirent *readdir(DIR *dirp);
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[256]; // 文件名
};
示例:
entry->d_name
closedirint closedir(DIR *dirp);
. 和 ..(常见需求)if (strcmp(entry->d_name, ".") != 0 &&
strcmp(entry->d_name, "..") != 0) {
printf("%s\n", entry->d_name);
}
⚠️ d_type 不是 100% 可移植,推荐用 stat
d_type(快速)if (entry->d_type == DT_REG) {
printf("普通文件: %s\n", entry->d_name);
} else if (entry->d_type == DT_DIR) {
printf("目录: %s\n", entry->d_name);
}
stat(最可靠)#include <sys/stat.h>
struct stat st;
stat(entry->d_name, &st);
if (S_ISREG(st.st_mode)) {
printf("普通文件\n");
} else if (S_ISDIR(st.st_mode)) {
printf("目录\n");
}
❌ 错误用法:
readdir /home
✅ 正确方式:
ls
或
find
| 问题 | 说明 |
|---|---|
| 返回 NULL | 目录已读完或出错 |
| 不显示文件 | 忘记 opendir |
| 段错误 | 没检查 opendir 返回值 |
| 中文乱码 | 与本地编码有关,不是 readdir 的问题 |
readdir 是 C 语言中用来逐个读取目录项的函数,配合 opendir / closedir 使用。
如果你愿意,我可以:
readdir vs readdir_r vs getdents你现在是 写代码用 还是 理解原理?