插件窝 干货文章 readdir在Linux系统中如何使用

readdir在Linux系统中如何使用

readdir 目录 使用 文件 861    来源:    2025-05-06

readdir 在 Linux 系统中的使用指南

readdir 是 Linux/UNIX 系统中用于读取目录内容的函数,属于 POSIX 标准的一部分。下面我将详细介绍它的使用方法。

基本介绍

readdir 函数用于读取目录中的条目(文件和子目录),它通常与 opendirclosedir 配合使用。

函数原型

#include <sys/types.h>
#include <dirent.h>

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

使用步骤

  1. 使用 opendir() 打开目录
  2. 使用 readdir() 循环读取目录内容
  3. 使用 closedir() 关闭目录

示例代码

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

int main(int argc, char *argv[]) {
    DIR *dir;
    struct dirent *entry;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
        return 1;
    }

    dir = opendir(argv[1]);
    if (dir == NULL) {
        perror("opendir failed");
        return 1;
    }

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

    if (errno != 0) {
        perror("readdir failed");
        closedir(dir);
        return 1;
    }

    closedir(dir);
    return 0;
}

struct dirent 结构

readdir 返回的 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];   /* 文件名 */
};

文件类型检测

可以使用 d_type 成员来判断文件类型:

switch (entry->d_type) {
    case DT_REG:
        printf("常规文件: %s\n", entry->d_name);
        break;
    case DT_DIR:
        printf("目录: %s\n", entry->d_name);
        break;
    case DT_LNK:
        printf("符号链接: %s\n", entry->d_name);
        break;
    // 其他类型...
}

注意事项

  1. readdir 不是线程安全的,多线程环境下应考虑使用 readdir_r(但注意,在较新的 glibc 中 readdir_r 已被弃用)
  2. readdir 返回的条目顺序是不确定的
  3. 每次调用 readdir 都会返回下一个目录条目,直到返回 NULL 表示结束
  4. 错误处理很重要,应检查 errno 以确定是否出错

实际应用

readdir 常用于: - 实现 ls 命令类似功能 - 递归遍历目录树 - 查找特定文件 - 统计目录内容

希望这个指南能帮助你理解和使用 readdir 函数。如需更高级的目录操作,还可以考虑 scandirftw 等函数。