opendir和readdir

opendirreaddir 是用于文件和目录操作的C标准库函数,而不是系统调用。它们用于在C/C++程序中访问文件系统中的目录和文件。 

opendir函数: opendir 用于打开一个目录,并返回一个指向目录的指针(称为目录流)。

  • dirname 是要打开的目录的路径。
  • 函数返回一个指向 DIR 结构体的指针,可以使用这个指针来遍历目录中的条目。

readdir函数: readdir 用于读取目录中的条目(包括子目录和文件)。

    • dirp 是由 opendir 返回的目录流指针。
    • 函数返回一个指向 struct dirent 结构体的指针,这个结构体包含了目录中的一个条目的信息,包括文件名、文件类型等。
    • 使用 readdir 可以逐个读取目录中的文件和子目录,直到到达目录的末尾。

这些函数通常与其他文件和目录操作函数一起使用,例如 closedir 用于关闭目录流,stat 用于获取文件信息,以便进一步处理文件。请注意,opendirreaddir 是C标准库的函数,而不是底层的系统调用。系统调用通常提供更底层的操作,而这些库函数是在系统调用的基础上构建的。在不同的操作系统上,这些库函数可能会有所不同,但它们的基本功能相似。

/*
        man  2 系统调用
        man  3 c运行库调用
       #include <sys/types.h>
       #include <dirent.h>
       DIR *opendir(const char *name);
            参数:
                -name:  需要打开的目录名称
            返回值:
                DIR: * 类型,理解为目录流
                错误返回null

       #include <dirent.h>
       struct dirent *readdir(DIR *dirp);
            作用:
                读取目录中的数据
            参数:
                dirp是opendir返回的结果
            返回值:
                struct dirent ,代表能读取到文件的信息
                读取到末尾挥着失败: 返回null

        struct dirent {
        ino_t d_ino;           // 文件的inode号
        off_t d_off;           // 在目录文件中的偏移量
        unsigned short d_reclen; // 文件名的长度
        unsigned char d_type;  // 文件类型
        char d_name[];         // 文件名
            };
        d_type 字段:
        DT_BLK:块设备文件,表示这是一个块设备节点。
        DT_CHR:字符设备文件,表示这是一个字符设备节点。
        DT_DIR:目录,表示这是一个目录。
        DT_LNK:软链接(符号链接),表示这是一个符号链接文件。
        DT_FIFO:管道,表示这是一个命名管道(FIFO)。
        DT_REG:普通文件,表示这是一个常规文件。
        DT_SOCK:套接字,表示这是一个套接字文件。
        DT_UNKNOWN:未知类型,表示文件或目录的类型未知或不受支持。




       #include <sys/types.h>
       #include <dirent.h>
       int closedir(DIR *dirp);


 */


#include "sys/types.h"
#include "direct.h"
#include "stdio.h"
#include <dirent.h>
#include <stdlib.h>
int getFileNum(const char *path);



// 读取某个目录下所有普通文件的个数
int main(int argc,char *argv[]){
//    if(argc<2){
//        printf("%s path\n",argv[0]);
//        return -1;
//    }
    int num = getFileNum("F:\\数据集\\tigress处理\\合并");
    printf("普通文件个数: %d\n",num);
    return 0;
}

// 用于获取目录下所由普通文件的个数
int getFileNum(const char *path){
    DIR *dir = opendir(path);
    if(dir==NULL){
        perror("opendir");
        exit(0);
    }
    struct dirent *ptr;
    // 记录普通文件个数
    int total =0;
    while((ptr= readdir(dir))!=NULL){
        // 获取名称
        char *dname = ptr->d_name;


        // 忽略 . 和 ..
        if(strcmp(dname,".")==0 || strcmp(dname,"..")==0){
            continue;
        }
        // 判断是普通文件还是目录
        if(ptr->d_type == DT_DIR){
           // 目录,继续读取这个目录
            char newpath[256];
            sprintf(newpath,"%s/%s",path,dname);
            getFileNum(newpath);
        }
        if(ptr->d_type==DT_REG){
            // 普通文件
            total++;
        }

    }
    closedir(dir);
    return total;
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值