温馨提示×

linux copendir怎么使用

小樊
44
2026-10-08 07:14:31
栏目: 智能运维

在 Linux 下,opendir 是用于打开一个目录流的函数,通常和 readdir、closedir 配合使用,用来遍历目录中的文件。

下面从 函数原型、基本用法、完整示例、常见注意点 几个方面说明。


一、opendir 函数原型

#include <dirent.h>

DIR *opendir(const char *name);

返回值

  • 成功:返回指向 DIR 结构的指针(目录流)
  • 失败:返回 NULL,并设置 errno

二、配套函数

struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
  • readdir:读取目录中的一个条目
  • closedir:关闭目录流

三、最简单的使用示例

1️⃣ 打开目录并列出文件

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

int main() {
    DIR *dir;
    struct dirent *entry;

    dir = opendir(".");
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

编译运行

gcc test.c -o test
./test

四、结构体 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 值

DT_REG  普通文件
DT_DIR  目录
DT_LNK  符号链接

五、判断文件类型示例

while ((entry = readdir(dir)) != NULL) {
    if (entry->d_type == DT_DIR) {
        printf("[DIR] %s\n", entry->d_name);
    } else {
        printf("[FILE] %s\n", entry->d_name);
    }
}

六、常见错误和注意点

1️⃣ 忘记 closedir

✅ 必须调用 closedir,否则会文件描述符泄漏


2️⃣ . 和 ..

目录中一定包含:

.
..

通常需要忽略:

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

3️⃣ 路径不存在

opendir("/not/exist");

返回 NULL,用 perror 查看原因。


七、与 fopen 的区别

函数 用途
fopen 打开普通文件
opendir 打开目录

❌ 不能用 fopen 读目录


如果你愿意,我可以:

  • 给你一个 递归遍历目录 的例子
  • 讲 opendir vs scandir
  • 或结合 C++ / Linux 系统编程 讲

你想看哪一个?

0 踩