linux系统<dirent.h> 中readdir、opendir 和 closedir的使用方法

readdir、opendir 和 closedir 是用于目录操作的标准库函数,定义在 <dirent.h> 头文件中。它们用于打开目录、读取目录内容以及关闭目录流。以下是这些函数的详细说明和用法。

opendir

功能:打开一个目录并返回一个 DIR* 类型的指针,表示目录流。

声明:

DIR *opendir(const char *name);
 

参数:
- name:要打开的目录的路径。

返回值:
- 成功时返回一个 DIR* 指针,表示目录流。
- 失败时返回 NULL,并设置 errno 以指示错误。

示例:

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

int main() {
    DIR *dir = opendir(".");
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }
    closedir(dir);
    return 0;
}
 

readdir

功能:从目录流中读取下一个目录项。

声明:

struct dirent *readdir(DIR *dirp);
 

参数:
- dirp:由 opendir 返回的 DIR* 指针。

返回值:
- 成功时返回指向 struct dirent 的指针,struct dirent 结构体包含目录项的信息。
- 读取完所有目录项后,返回 `NULL`。如果发生错误,返回 `NULL`,并设置 `errno`。

示例:

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

int main() {
    DIR *dir = opendir(".");
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}
 

closedir

功能:关闭由 opendir 打开的目录流。

声明:

int closedir(DIR *dirp);
 

参数:
- dirp:由 opendir 返回的 DIR* 指针。

返回值:
- 成功时返回 0。
- 失败时返回 -1,并设置 errno 以指示错误。

示例:

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

int main() {
    DIR *dir = opendir(".");
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

    // 处理目录内容...

    if (closedir(dir) == -1) {
        perror("closedir");
        return 1;
    }

    return 0;
}
 

struct dirent 结构体

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]; // 目录项的名称
};
 

代码示例

以下代码展示了如何打开目录、读取目录内容并关闭目录流:


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

int main() {
    DIR *dir = opendir("."); // 打开当前目录
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 打印目录项的名称
        printf("文件名: %s\n", entry->d_name);
    }

    if (closedir(dir) == -1) {
        perror("closedir");
        return 1;
    }

    return 0;
}
 

总结

- opendir:用于打开目录,并返回一个目录流指针。
- readdir:用于读取目录流中的目录项。
- closedir:用于关闭目录流。

这三个函数提供了基本的目录操作功能,使得在程序中处理目录内容变得简单和直观。

`d_type` 是 `struct dirent` 结构体中的一个字段,用于表示目录项的类型。它是一个 `unsigned char` 类型的值,包含了文件系统中的各种文件和目录类型。`d_type` 的值由 `<dirent.h>` 头文件中定义的常量表示。

d_type 常量

以下是一些常见的 `d_type` 常量及其含义:

- DT_REG:普通文件(regular file)
- DT_DIR:目录(directory)
- DT_LNK:符号链接(symbolic link)
- DT_CHR:字符设备(character device)
- DT_BLK:块设备(block device)
- DT_FIFO:FIFO(先进先出)管道(named pipe)
- DT_SOCK:套接字(socket)
- DT_UNKNOWN:未知类型(unknown type)

使用示例

下面是一个示例程序,它展示了如何使用 `d_type` 来检查目录项的类型,并根据不同类型输出相应的信息:


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

int main() {
    DIR *dir = opendir(".");
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        printf("文件名: %s, 类型: ", entry->d_name);
        
        switch (entry->d_type) {
            case DT_REG:
                printf("普通文件\n");
                break;
            case DT_DIR:
                printf("目录\n");
                break;
            case DT_LNK:
                printf("符号链接\n");
                break;
            case DT_CHR:
                printf("字符设备\n");
                break;
            case DT_BLK:
                printf("块设备\n");
                break;
            case DT_FIFO:
                printf("FIFO管道\n");
                break;
            case DT_SOCK:
                printf("套接字\n");
                break;
            default:
                printf("未知类型\n");
                break;
        }
    }

    if (closedir(dir) == -1) {
        perror("closedir");
        return 1;
    }

    return 0;
}
 

解释

- DT_REG:表示目录项是一个普通文件。
- DT_DIR:表示目录项是一个目录。
- DT_LNK:表示目录项是一个符号链接。
- DT_CHR:表示目录项是一个字符设备文件。
- DT_BLK:表示目录项是一个块设备文件。
- DT_FIFO:表示目录项是一个 FIFO 管道。
- DT_SOCK:表示目录项是一个套接字。
- DT_UNKNOWN:表示目录项的类型未知,通常在某些文件系统或平台上使用。

注意事项

- 文件系统支持:不是所有的文件系统都支持所有的 d_type 常量。在某些文件系统中,d_type 可能总是返回 DT_UNKNOWN,这时你可能需要使用 stat 函数来获取文件类型。
- 兼容性:不同的操作系统和文件系统可能对这些常量有不同的支持情况。在编写跨平台代码时,需要特别注意这些兼容性问题。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值