在 Ubuntu(Linux)下使用 C 语言进行目录遍历时,opendir 本身不会告诉你“结束”,它只是打开目录并返回一个 DIR *。
判断“目录读取结束”是靠 readdir 的返回值来完成的。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
✅ 目录结束的标志是:
readdir(dir) == NULL
readdir 每调用一次,返回一个目录项NULL| 函数 | 返回值 | 含义 |
|---|---|---|
opendir |
NULL |
打开失败(权限不足、路径不存在等) |
readdir |
NULL |
目录读取结束 或 出错 |
closedir |
0 / -1 |
关闭成功 / 失败 |
如果你想严格区分:
#include <errno.h>
errno = 0;
entry = readdir(dir);
if (entry == NULL) {
if (errno != 0) {
perror("readdir");
} else {
// 正常结束
}
}
opendir 只负责打开目录,readdir 返回 NULL 才表示目录遍历结束。
如果你愿意,我也可以给你:
scandir 用法std::filesystem 写法FindNextFile 的对比