在 Ubuntu(Linux)下使用 C 语言进行目录操作时,opendir 函数用于打开一个目录流。处理 opendir 的错误非常重要,以保障程序的健壮性。
opendir 基本用法#include <dirent.h>
#include <stdio.h>
DIR *opendir(const char *name);
DIR 结构的指针NULL,并设置 errnoperror 或 strerror#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/some/path");
if (dir == NULL) {
perror("opendir failed");
// 或者
// fprintf(stderr, "opendir error: %s\n", strerror(errno));
return 1;
}
// 使用目录
closedir(dir);
return 0;
}
errno| 错误码 | 含义 |
|---|---|
ENOENT |
目录不存在 |
EACCES |
权限不足 |
ENOTDIR |
路径不是目录 |
EMFILE |
进程打开文件数过多 |
ENAMETOOLONG |
路径名过长 |
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
DIR *dir = opendir("/root");
if (dir == NULL) {
if (errno == EACCES) {
fprintf(stderr, "权限不足\n");
} else if (errno == ENOENT) {
fprintf(stderr, "目录不存在\n");
} else {
fprintf(stderr, "opendir error: %s\n", strerror(errno));
}
return 1;
}
closedir(dir);
return 0;
}
readdir 配合使用时的注意点struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
readdir 出错时也会返回 NULLerrno 判断是“结束”还是“出错”errno = 0;
entry = readdir(dir);
if (entry == NULL && errno != 0) {
perror("readdir failed");
}
gcc opendir_test.c -o opendir_test
./opendir_test
✅ 正确处理 opendir 错误的关键:
NULLerrno 判断具体错误perror / strerror 输出错误信息DIR *如果你需要 C++ / Python / Shell 的目录错误处理,也可以告诉我。