插件窝 干货文章 linux 打开目录用什么函数

linux 打开目录用什么函数

目录 函数 DIR 返回 761    来源:    2025-04-29

在 Linux 系统编程中,打开/读取目录常用的函数如下:

核心函数

  1. opendir()

    • 功能:打开目录流
    • 原型:DIR *opendir(const char *name);
    • 参数:目录路径字符串
    • 返回:成功返回 DIR* 指针,失败返回 NULL
  2. readdir()

    • 功能:读取目录条目
    • 原型:struct dirent *readdir(DIR *dirp);
    • 返回:成功返回 dirent 结构指针,到达目录末尾/出错返回 NULL
  3. closedir()

    • 功能:关闭目录流
    • 原型:int closedir(DIR *dirp);

辅助函数

  • rewinddir(DIR *dirp) - 重置目录流到起始位置
  • dirfd(DIR *dirp) - 获取目录的文件描述符

数据结构

struct dirent {
    ino_t d_ino;       // 文件inode号
    off_t d_off;       // 目录偏移量
    unsigned short d_reclen;  // 记录长度
    unsigned char d_type;     // 文件类型
    char d_name[256];  // 文件名
};

示例代码

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

void list_dir(const char *path) {
    DIR *dir = opendir(path);
    if (!dir) {
        perror("opendir");
        return;
    }

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

    closedir(dir);
}

int main() {
    list_dir("/tmp");
    return 0;
}

注意事项

  1. 检查函数返回值,特别是 opendir() 可能因权限不足或路径不存在失败
  2. readdir() 不是线程安全的,多线程环境应使用 readdir_r()(但注意该函数在较新版本中已被废弃)
  3. 遍历大目录时注意性能,可考虑使用 scandir() 进行过滤排序
  4. d_type 字段不是所有文件系统都支持,需要检查 _DIRENT_HAVE_D_TYPE

替代方案

  • 对于简单目录遍历,也可考虑使用 nftw()(文件树遍历函数)
  • 需要更复杂操作时,可以结合 stat() 获取文件详细信息

这些函数是 POSIX 标准的一部分,在所有 Linux/Unix 系统上均可使用。