温馨提示×

readdir返回值代表什么含义

小樊
34
2026-08-29 07:09:27
栏目: 编程语言

Linux/Unix 的 C 语言编程中,readdir 用来读取目录内容,它的返回值含义如下:


一、readdir 的函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

二、返回值含义

✅ 成功时

  • 返回一个 指向 struct dirent 的指针
  • 表示目录中的下一个条目(文件或子目录)

例如:

struct dirent *entry;
entry = readdir(dir);

entry 指向当前读到的目录项。


❌ 失败时

  • 返回 NULL
  • 并且设置 errno 表示错误原因

✅ 目录读取结束时

  • 也返回 NULL
  • 此时 errno 未被设置

⚠️ 重点

readdir 返回 NULL 时,可能是正常结束,也可能是出错,需要结合 errno 判断。


三、如何区分“结束”和“错误”

✅ 推荐写法

#include <errno.h>

errno = 0;
struct dirent *entry = readdir(dir);

if (entry == NULL) {
    if (errno != 0) {
        perror("readdir");
    } else {
        // 正常读取结束
    }
}

四、struct dirent 中常见字段

struct dirent {
    ino_t          d_ino;       // inode 号
    off_t          d_off;       // 偏移量
    unsigned short d_reclen;    // 记录长度
    unsigned char  d_type;      // 文件类型(部分系统支持)
    char           d_name[256]; // 文件名
};

通常最常用的是:

entry->d_name   // 文件名

五、简单示例

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

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

closedir(dir);

六、小结(记忆版)

返回值 含义
非 NULL 成功读取一个目录项
NULL + errno ≠ 0 读取失败
NULL + errno = 0 目录已读完

如果你愿意,我也可以帮你对比 readdir vs readdir_r vs getdents,或者结合 Windows 的 ReadDirectoryChanges 讲区别。

0