在 Debian(以及其它 Linux 系统)上,readdir 是 C 语言中用于读取目录内容的函数,定义在 <dirent.h> 中。下面从基本概念 → 使用示例 → 常见问题给你讲清楚。
readdir 用来逐个读取目录中的文件和子目录。
函数原型:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
dirp:由 opendir() 返回的目录流指针struct dirent 的指针NULL#include <stdio.h>
#include <dirent.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;
}
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:文件名(最常用)d_type:
DT_REG:普通文件DT_DIR:目录DT_LNK:符号链接while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
printf("文件: %s\n", entry->d_name);
}
}
. 和 ..while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
gcc readdir_example.c -o readdir_example
./readdir_example
readdir:非线程安全readdir_r:线程安全(已逐步废弃,推荐用 readdir + 锁)可以,但更推荐:
std::filesystem::directory_iterator(C++17)可以,在 DT_DIR 时递归调用 opendir/readdir
如果你想要:
告诉我,我可以直接给你代码。