插件窝 干货文章 Linux readdir返回值含义解析

Linux readdir返回值含义解析

目录 readdir 返回 使用 363    来源:    2025-05-04

Linux readdir() 返回值含义解析

readdir() 是 Linux/Unix 系统中用于读取目录内容的函数,属于 POSIX 标准的一部分。下面我将详细解析其返回值含义。

函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

返回值含义

成功情况

  • 返回一个指向 struct dirent 结构的指针,该结构包含目录中下一个目录项的信息
  • 结构体通常包含以下重要字段:
    • d_ino: 文件的 inode 号
    • d_name: 文件名(以 null 结尾的字符串)
    • d_type: 文件类型(非 POSIX 标准,但大多数现代系统支持)

特殊情况

  1. 到达目录末尾

    • 返回 NULL 指针
    • errno 不会被修改
  2. 发生错误

    • 返回 NULL 指针
    • errno 被设置为相应的错误代码
    • 常见错误包括:
      • EBADF: 无效的目录流描述符
      • ENOENT: 当前目录项已被删除
      • ENOTDIR: 给定的路径不是目录

正确使用模式

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

DIR *dir;
struct dirent *entry;

dir = opendir("/path/to/directory");
if (dir == NULL) {
    // 处理打开目录失败的情况
    perror("opendir");
    return;
}

errno = 0;
while ((entry = readdir(dir)) != NULL) {
    // 处理每个目录项
    printf("%s\n", entry->d_name);
}

if (errno != 0) {
    // 处理readdir错误
    perror("readdir");
}

closedir(dir);

注意事项

  1. 返回值检查:必须同时检查返回值为 NULL 和 errno 来确定是错误还是目录结束
  2. 线程安全readdir() 不是线程安全的,考虑使用 readdir_r()(已废弃)或 scandir()
  3. 可重入性readdir() 使用静态缓冲区,不是可重入函数
  4. 文件类型d_type 字段不是 POSIX 标准,使用时需要检查 _DIRENT_HAVE_D_TYPE

现代替代方案

对于新代码,可以考虑使用更现代的接口: - scandir(): 可以过滤和排序目录项 - getdents(): Linux 特有的系统调用,提供更多控制 - C++17 的 std::filesystem 库(如果使用 C++)

希望这个解析对您理解和使用 readdir() 函数有所帮助。