opendir和readdir

opendir和readdir是 C 标准库的函数 而不是底层的系统调用

大家好,欢迎来到IT知识分享网。

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; }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120833.html

(0)
上一篇 2025-10-27 10:33
下一篇 2025-10-27 11:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信