在 Debian(或者说 Linux 下 C/C++ 编程)里,readdir 的错误处理一般分 函数调用错误 和 目录遍历逻辑错误 两类。下面按常见场景说明。
readdir 相关函数通常是:
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
opendir 失败opendir 失败返回 NULL,需要查 errno:
#include <stdio.h>
#include <errno.h>
#include <dirent.h>
DIR *dir = opendir("/some/path");
if (dir == NULL) {
perror("opendir");
// 常见 errno:
// ENOENT 目录不存在
// EACCES 权限不足
// ENOTDIR 不是目录
return -1;
}
readdir 的错误处理(重点)readdir 原型:
struct dirent *readdir(DIR *dirp);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 正常处理 entry
}
NULL 不一定是错误errno 不变errno 被设置errno = 0;
while ((entry = readdir(dir)) != NULL) {
// 正常处理
}
if (errno != 0) {
perror("readdir");
// 读目录过程中出错
}
⚠️ 必须在循环前
errno = 0,否则无法区分“结束”和“错误”。
closedir 失败if (closedir(dir) != 0) {
perror("closedir");
}
通常可以忽略,但严谨程序应处理。
#include <stdio.h>
#include <errno.h>
#include <dirent.h>
int list_dir(const char *path) {
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return -1;
}
struct dirent *entry;
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir");
closedir(dir);
return -1;
}
if (closedir(dir) != 0) {
perror("closedir");
return -1;
}
return 0;
}
在 Debian / glibc 中,推荐用:
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
或更现代的:
int readdir_r(DIR *, struct dirent *, struct dirent **);
不过 glibc 已不推荐 readdir_r,直接用 readdir + 单线程/加锁即可。
| 错误 | 原因 |
|---|---|
ENOENT |
目录不存在 |
EACCES |
权限不足 |
ENOTDIR |
不是目录 |
EBADF |
DIR 指针无效 |
EMFILE / ENFILE |
文件描述符耗尽 |
如果你是在 Debian + C++ / Python / Shell 里用 readdir,或者遇到具体报错信息,可以贴出来,我可以直接帮你定位。