Linux系统编程:获取指定目录下指定文件类型的数量

分析

编程实现对指定目录下的指定文件类型数量的统计。这里涉及到对目录文件的打开和对目录文件下的文件的遍历。

这里主要用的2个库函数,打开目录的 opendir函数,readdir函数。对这2个库函数不熟悉?请看man 3 readdir,man 3 opendir,非常详细。opendir函数 打开失败的时候 返回NULL ,errorno被设置,可以通过perror获取错误信息。readdir函数会遍历目录下的所有文件,注意是一个一个的返回,注意是读一次返回一次,返回的struct dirent 结构体指针,里面包含文件的类型、文件的名称、文件大小等 文件信息

opendir函数说明

Linux系统编程:获取指定目录下指定文件类型的数量_第1张图片

readdir函数说明

Linux系统编程:获取指定目录下指定文件类型的数量_第2张图片

实现代码

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

运行结果

Linux系统编程:获取指定目录下指定文件类型的数量_第3张图片


你可能感兴趣的:(【Language_C】)