温馨提示×

linux readdir怎么使用

小樊
36
2026-09-20 22:29:28
栏目: 智能运维

在 Linux 下,readdir 是用于读取目录内容的函数,常见于 C 语言编程。下面从基本用法、示例代码、注意事项三个方面说明。


一、readdir 基本概念

readdir 用于读取一个已打开目录中的目录项(文件/子目录)。

相关头文件

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

相关数据结构

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

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]; // 文件名
};

二、基本使用步骤

  1. opendir() 打开目录
  2. readdir() 循环读取目录项
  3. closedir() 关闭目录

三、示例:列出目录中所有文件名

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

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

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

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

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

    closedir(dir);
    return 0;
}

编译运行

gcc readdir_example.c -o readdir_example
./readdir_example /tmp

四、常见过滤用法

1. 跳过 . 和 ..

if (strcmp(entry->d_name, ".") == 0 ||
    strcmp(entry->d_name, "..") == 0)
    continue;

2. 判断文件类型(Linux 扩展)

if (entry->d_type == DT_REG)
    printf("普通文件: %s\n", entry->d_name);
else if (entry->d_type == DT_DIR)
    printf("目录: %s\n", entry->d_name);

⚠️ d_type 在某些文件系统上可能为 DT_UNKNOWN


五、注意事项

  • readdir 不是线程安全的
    多线程请用 readdir_r(已逐步废弃)或 readdir + 加锁
  • readdir 返回的是静态内存指针,不要 free
  • 遍历顺序不保证(通常是目录存储顺序)
  • 需要递归遍历目录时要自己写递归函数

六、进阶:递归遍历目录(简要)

void list_dir(const char *path) {
    DIR *dir = opendir(path);
    struct dirent *entry;

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_DIR) {
            // 递归处理
        }
    }
    closedir(dir);
}

如果你是想:

  • 用 shell 而不是 C
  • 或用 C++ / Python
  • 或想知道 readdir 和 getdents 的区别

可以告诉我,我可以进一步说明。

0 踩