编程实现对指定目录下的指定文件类型数量的统计。这里涉及到对目录文件的打开和对目录文件下的文件的遍历。
这里主要用的2个库函数,打开目录的 opendir函数,readdir函数。对这2个库函数不熟悉?请看man 3 readdir,man 3 opendir,非常详细。opendir函数 打开失败的时候 返回NULL ,errorno被设置,可以通过perror获取错误信息。readdir函数会遍历目录下的所有文件,注意是一个一个的返回,注意是读一次返回一次,返回的struct dirent 结构体指针,里面包含文件的类型、文件的名称、文件大小等 文件信息。
#include
#include
#include
#include
char* fileType = NULL;
// [-,d,p,s,l,c,b] 转化为 对应的 文件类型
unsigned char GetFileType(char* type)
{
if(strcmp(type,"b")==0)
{
return DT_BLK;
}else if(strcmp(type,"c")==0)
{
return DT_CHR;
}else if(strcmp(type,"d")==0)
{
return DT_DIR;
}else if(strcmp(type,"p")==0)
{
return DT_FIFO;
}else if(strcmp(type,"l")==0)
{
return DT_LNK;
}else if(strcmp(type,"-")==0)
{
return DT_REG;
}else if(strcmp(type,"s")==0)
{
return DT_SOCK;
}else
{
printf("文件类型输入错误,文件类型为[-,d,p,s,l,c,b]\n");
exit(1);
}
}
int GetFileNum(const char* path)
{
int total = 0;
DIR* dir = opendir(path);
if(dir==NULL)
{
perror("opendir error");
exit(1);
}
struct dirent* dirObj = NULL;
char* dirName = NULL;
//循环读取目录下的文件
while(dirObj = readdir(dir))
{
dirName = dirObj->d_name;
if(strcmp(dirName,".")==0 || strcmp(dirName,"..")==0)
{
continue;
}
if(dirObj->d_type == GetFileType(fileType) )
{
total++;
}
if(dirObj->d_type==DT_DIR)
{
char temp[1024] = {0};
sprintf(temp,"%s/%s",path,dirName);
//碰到目录文件进行递归遍历
total+= GetFileNum(temp);
}
}
return total;
}
int main(int argc,int* argv[])
{
if(argc<3)
{
printf("./GetFileNum path fileType");
exit(0);
}
char* path = argv[1];
fileType = argv[2];
int num = GetFileNum(path);
printf("%s目录下有%s文件:%d\n",path,fileType,num);
return 0;
}