opendir
和 readdir
是用于文件和目录操作的C标准库函数,而不是系统调用。它们用于在C/C++程序中访问文件系统中的目录和文件。
opendir函数: opendir
用于打开一个目录,并返回一个指向目录的指针(称为目录流)。
dirname
是要打开的目录的路径。- 函数返回一个指向
DIR
结构体的指针,可以使用这个指针来遍历目录中的条目。
readdir函数: readdir
用于读取目录中的条目(包括子目录和文件)。
-
dirp
是由opendir
返回的目录流指针。- 函数返回一个指向
struct dirent
结构体的指针,这个结构体包含了目录中的一个条目的信息,包括文件名、文件类型等。 - 使用
readdir
可以逐个读取目录中的文件和子目录,直到到达目录的末尾。
这些函数通常与其他文件和目录操作函数一起使用,例如 closedir
用于关闭目录流,stat
用于获取文件信息,以便进一步处理文件。请注意,opendir
和 readdir
是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;
}