在 Linux 下,opendir 是用于打开一个目录流的函数,通常和 readdir、closedir 配合使用,用来遍历目录中的文件。
下面从 函数原型、基本用法、完整示例、常见注意点 几个方面说明。
#include <dirent.h>
DIR *opendir(const char *name);
DIR 结构的指针(目录流)NULL,并设置 errnostruct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
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 test.c -o test
./test
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 符号链接
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
printf("[DIR] %s\n", entry->d_name);
} else {
printf("[FILE] %s\n", entry->d_name);
}
}
✅ 必须调用 closedir,否则会文件描述符泄漏
. 和 ..目录中一定包含:
.
..
通常需要忽略:
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
opendir("/not/exist");
返回 NULL,用 perror 查看原因。
| 函数 | 用途 |
|---|---|
| fopen | 打开普通文件 |
| opendir | 打开目录 |
❌ 不能用 fopen 读目录
如果你愿意,我可以:
你想看哪一个?