在 Ubuntu(Linux)下,readdir 通常是 C 语言中使用目录操作的函数,来自 <dirent.h>。下面从「是什么、怎么用、完整示例、常见问题」给你讲清楚。
readdir 用于逐个读取目录中的文件和子目录。
函数原型:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
DIR* 目录流(由 opendir 打开)struct dirent 的指针NULLopendir() // 打开目录
↓
readdir() // 循环读取
↓
closedir() // 关闭目录
#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;
}
gcc readdir_example.c -o readdir_example
./readdir_example
struct dirent {
ino_t d_ino; // inode 号
off_t d_off;
unsigned short d_reclen;
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名
};
DT_REG // 普通文件
DT_DIR // 目录
DT_LNK // 符号链接
示例:
if (entry->d_type == DT_DIR) {
printf("[DIR] %s\n", entry->d_name);
}
. 和 ..if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
如果你需要递归列出子目录,可以配合 stat 或 d_type 自己写递归函数(或者用 nftw)。
readdir ❌ 不是线程安全readdir_r(已不推荐)或 readdir + 加锁<filesystem>(C++17)不用写代码:
ls
ls -a
find .
如果你愿意,我可以:
你现在是 写 C 程序 还是 只是想理解怎么用?