readdir 是 C 语言里用来读取目录内容的函数,通常配合 opendir / closedir 使用。下面给你一个从零开始的完整示例,说明如何用 readdir 获取文件名。
#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;
}
.
..
main.c
test.txt
a.out
readdir() 返回的是一个结构体指针:
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 // 文件名
. 和 ..while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
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);
}
⚠️ 注意:d_type 在某些文件系统(如 NFS)上可能不可用。
dir = opendir("/home/user/");
❌ 忘记 opendir
❌ 忘记 closedir
❌ 把 readdir 当成返回字符串的函数
✅ 正确流程:
opendir → readdir 循环 → closedir
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
int main(int argc, char *argv[]) {
const char *path = argc > 1 ? argv[1] : ".";
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
编译:
gcc readdir_example.c -o readdir_example
运行:
./readdir_example
./readdir_example /tmp
如果你用的是 C++ / Python / Linux shell,或者想递归遍历目录,我也可以继续帮你写。