Linux 下 C语言递归实现目录下文件的统计

系统编程_1

刚接触linux下的C语言编程,试着写了常见命令ls的相关参数,其中自己感觉-R选项的实现还是比较麻烦,走了不少弯路。血与泪的创作开始了(滑稽)。


int Recursive(char *path)
{
    DIR * dir;
    struct stat buf;
    struct dirent *ptr;
    int i = 0,count = 0,k = 0,m;
    char st[20000];
    char * p;
    char name[20000];                   //当你想统计'/'目录下的文件的时候,大数组完全就是种享受(滑稽)
    p  = path + strlen(path);   
    if(lstat(path,&buf) < 0)            //获取目录属性
    {
        perror("lstat");
        return -1;
    }
    if(S_ISDIR(buf.st_mode) == 0)       //判断是否是目录文件
    {
        return -1;
    }
    if(*(p-1)!= '/')                    //将目录文件路径补充完整
    {
        *p++ = '/';
        *p = 0;
    }
    printf("\n");
    puts(path);                         //输出该级目录路径
    if((dir = opendir(path)) == NULL)   //打开指定目录
    {
        perror("opendir");
        return -1;
    }
    while((ptr = readdir(dir)) != NULL)
    {
        if((strcmp(ptr->d_name,".")==0) || (strcmp(ptr->d_name,"..")==0))
              continue;                 //剔除隐藏文件
        strcpy(p,ptr->d_name);
        strcpy(name,path);              //保存文件所在路径名
        for(i = 0;i<strlen(name);i++)   //单纯的获得文件名称
        {
            if(name[i] == '/')
            {
                k = 0;
                continue;
            }
            st[k] = name[i];
            k++;
        }
         st[k] = '\0';
             printf("%s\t",st);       //输出该层目录下的文件名称
        if(lstat(name,&buf) < 0)      //对该层目录下的文件进行判断与删选
        {
            perror("lstat");
            return -1;
        }
        if(S_ISDIR(buf.st_mode) < 0)    //如果不是目录文件继续遍历该层其余文件
            continue;
            if(Recursive(name) == 0)    //继续沿着目录文件向下访问
            printf("\n");
    }
    p[-1] = 0;
    if((m =closedir(dir)) == -1)
    {
        return -1;
    }
    printf("\n");
        return 0;

}

以下是程序是程序运行的结果:

其中test_dir ,test_dir1 是目录文件
下方对应输出其中的文件

猜你喜欢

转载自blog.csdn.net/Cxinsect/article/details/81253349