在 Ubuntu(Linux) 下,opendir() 是用来打开目录流,配合 readdir() 遍历目录内容的,属于 POSIX 标准 API,常用于 C/C++ 程序。
下面给你一个 完整、可用的示例,从概念到代码一步步说明。
使用 opendir 遍历目录的一般步骤:
opendir(path) 打开目录readdir(dir) 读取目录项closedir(dir) 关闭目录/home 目录#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir("/home");
if (dir == NULL) {
perror("opendir");
return EXIT_FAILURE;
}
while ((entry = readdir(dir)) != NULL) {
printf("文件名: %s\n", entry->d_name);
}
closedir(dir);
return EXIT_SUCCESS;
}
gcc listdir.c -o listdir
./listdir
dirent 结构体字段struct dirent {
ino_t d_ino; // inode 号
off_t d_off;
unsigned short d_reclen;
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名
};
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)上可能不可用,此时需要用 lstat()。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
void list_dir(const char *path) {
DIR *dir = opendir(path);
struct dirent *entry;
char fullpath[1024];
if (!dir) return;
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name);
printf("%s\n", fullpath);
if (entry->d_type == DT_DIR) {
list_dir(fullpath);
}
}
closedir(dir);
}
int main() {
list_dir("/home");
return 0;
}
opendir 返回 NULLls -ld 目录名
closedir会导致 文件描述符泄露
| 函数 | 用途 |
|---|---|
opendir() |
打开目录 |
readdir() |
读取目录项 |
closedir() |
关闭目录 |
scandir() |
高级目录遍历(可排序、过滤) |
fts_open() |
递归遍历(更专业) |
可以用:
std::filesystem::directory_iterator(C++17,推荐)opendir如果你愿意,我可以给你 C++ 示例 或 只遍历特定类型文件(如 .txt) 的版本。