温馨提示×

linux readdir如何判断结束

小樊
45
2026-10-17 07:38:27
栏目: 智能运维

在 Linux 下使用 readdir()(或 readdir_r())遍历目录时,**判断“结束”**主要看返回值。


一、使用 readdir()(最常用)

函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

返回值说明

  • 成功且还有目录项:返回非空 struct dirent *
  • 目录读取结束:返回 NULL
  • 出错:返回 NULL,并设置 errno

⚠️ 注意:
readdir() 返回 NULL 时,不能直接判断是“结束”还是“出错”,需要用 errno 区分。


正确示例(推荐写法)

#include <stdio.h>
#include <dirent.h>
#include <errno.h>

int main() {
    DIR *dir = opendir(".");
    if (!dir) {
        perror("opendir");
        return 1;
    }

    errno = 0;
    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    if (errno != 0) {
        perror("readdir");
    }

    closedir(dir);
    return 0;
}

✅ 判断结束的核心逻辑

while ((entry = readdir(dir)) != NULL) {
    // 正常读取
}
// 跳出循环 = 结束或出错

二、使用 readdir_r()(线程安全,已逐渐废弃)

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
  • 成功:return 0
  • 结束:*result == NULL
  • 出错:返回非 0(错误码)

示例:

struct dirent ent;
struct dirent *res;

while (readdir_r(dir, &ent, &res) == 0 && res != NULL) {
    printf("%s\n", ent.d_name);
}

三、常见错误理解 ❌

❌ 错误:用 entry == NULL 就认为目录为空

entry = readdir(dir);
if (!entry) {
    // 可能是结束,也可能是出错
}

❌ 错误:忽略 errno

readdir() 返回 NULL 不代表一定是结束。


四、总结

情况 判断方式
目录读取结束 readdir() 返回 NULL 且 errno == 0
读取出错 readdir() 返回 NULL 且 errno != 0
还有内容 返回非 NULL

✅ 最佳实践:

while ((entry = readdir(dir)) != NULL) + 循环后检查 errno

如果你需要 递归遍历目录 / 过滤文件类型 / 使用 getdents 底层接口,也可以继续问我。

0 踩