温馨提示×

debian readdir怎么错误处理

小樊
36
2026-10-21 21:35:25
栏目: 智能运维

在 Debian(或者说 Linux 下 C/C++ 编程)里,readdir 的错误处理一般分 函数调用错误 和 目录遍历逻辑错误 两类。下面按常见场景说明。


一、readdir 相关函数

通常是:

#include <dirent.h>

DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

二、常见错误处理方式

1️⃣ 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;
}

2️⃣ readdir 的错误处理(重点)

readdir 原型:

struct dirent *readdir(DIR *dirp);

✅ 正确判断方式

struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    // 正常处理 entry
}

⚠️ 错误 vs 结束

  • 返回 NULL 不一定是错误
  • 需要区分:
    • 目录读完:errno 不变
    • 发生错误:errno 被设置
errno = 0;
while ((entry = readdir(dir)) != NULL) {
    // 正常处理
}

if (errno != 0) {
    perror("readdir");
    // 读目录过程中出错
}

⚠️ 必须在循环前 errno = 0,否则无法区分“结束”和“错误”。


3️⃣ 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,或者遇到具体报错信息,可以贴出来,我可以直接帮你定位。

0 踩