首页 > 其他分享 >ls实现

ls实现

时间:2022-10-14 20:44:56浏览次数:37  
标签:info name 实现 char ls str printf mode

    #include <stdio.h>  
    #include <sys/types.h>  
    #include <dirent.h>  
    #include <sys/stat.h>  
    #include <pwd.h>  
    #include <grp.h>  
    #include <unistd.h>  
    #include <string.h>  
    #define LS_NONE 0  
    #define L 101  
    #define R 102  
    #define D 103  
    #define I 104  
    #define A 200  
    #define AL (A+L)  
    #define AI (A+I)   
    void show_file(char* filename, struct stat* info_p)  
    {  
        char* uid_to_name(), *ctime(), *gid_to_name(), *filemode();  
        void mode_to_letters();  
        char modestr[11];  
        mode_to_letters(info_p->st_mode, modestr);  
      
        printf("%s", modestr);  
        printf(" %4d", (int) info_p->st_nlink);  
        printf(" %-8s", uid_to_name(info_p->st_uid));  
        printf(" %-8s", gid_to_name(info_p->st_gid));  
        printf(" %8ld", (long) info_p->st_size);  
        printf(" %.12s", 4 + ctime(&info_p->st_mtime));  
        printf(" %s\n", filename);  
    }  
      
    void mode_to_letters(int mode, char str[])  
    {  
        strcpy(str, "----------");  
      
        if (S_ISDIR(mode))  
        {  
            str[0] = 'd';  
        }  
      
        if (S_ISCHR(mode))  
        {  
            str[0] = 'c';  
        }  
      
        if (S_ISBLK(mode))  
        {  
            str[0] = 'b';  
        }  
      
        if ((mode & S_IRUSR))  
        {  
            str[1] = 'r';  
        }  
      
        if ((mode & S_IWUSR))  
        {  
            str[2] = 'w';  
        }  
      
        if ((mode & S_IXUSR))  
        {  
            str[3] = 'x';  
        }  
      
        if ((mode & S_IRGRP))  
        {  
            str[4] = 'r';  
        }  
      
        if ((mode & S_IWGRP))  
        {  
            str[5] = 'w';  
        }  
      
        if ((mode & S_IXGRP))  
        {  
            str[6] = 'x';  
        }  
      
        if ((mode & S_IROTH))  
        {  
            str[7] = 'r';  
        }  
      
        if ((mode & S_IWOTH))  
        {  
            str[8] = 'w';  
        }  
      
        if ((mode & S_IXOTH))  
        {  
            str[9] = 'x';  
        }  
    }  
      
    char* uid_to_name(uid_t uid)  
    {  
        struct passwd* getpwuid(),* pw_ptr;  
        static char numstr[10];  
      
        if((pw_ptr = getpwuid(uid)) == NULL)  
        {  
            sprintf(numstr,"%d",uid);  
      
            return numstr;  
        }  
        else  
        {  
            return pw_ptr->pw_name;  
        }  
    }  
      
    char* gid_to_name(gid_t gid)  
    {  
        struct group* getgrgid(),* grp_ptr;  
        static char numstr[10];  
      
        if(( grp_ptr = getgrgid(gid)) == NULL)  
        {  
            sprintf(numstr,"%d",gid);  
            return numstr;  
        }  
        else  
        {  
            return grp_ptr->gr_name;  
        }  
    }  
      
    void do_ls(char dirname[],int mode)  
    {  
        DIR* dir_ptr;  
        struct dirent* direntp;  
      
        if ((dir_ptr = opendir(dirname)) == NULL)  
        {  
            fprintf(stderr, "ls2: cannot open %s \n", dirname);  
        }  
        else  
        {  
            if(mode==D)  
            {  
                printf("%s\n", dirname);  
            }  
            else  
            {  
                char dirs[20][100];  
                int dir_count = 0;  
                  
                while ((direntp = readdir(dir_ptr)) != NULL)  
                {  
      
                    if(mode < 200 && direntp->d_name[0]=='.')  
                    {  
                        continue;  
                    }  
      
                    char complete_d_name[200];  // 文件的完整路径  
                    strcpy (complete_d_name,dirname);  
                    strcat (complete_d_name,"/");  
                    strcat (complete_d_name,direntp->d_name);  
                      
                    struct stat info;  
                    if (stat(complete_d_name, &info) == -1)  
                    {  
                        perror(complete_d_name);  
                    }  
                    else  
                    {  
                        if(mode == L||mode == AL)  
                        {  
                            show_file(direntp->d_name, &info);  
                        }  
                        else if(mode == A||mode == LS_NONE||mode == I||mode == AI)  
                        {  
                            if(mode == I||mode == AI)  
                            {  
                                printf("%llu ", direntp->d_ino);  
                            }  
      
                            printf("%s\n", direntp->d_name);  
                        }  
                        else if(mode == R)  
                        {  
      
                            if(S_ISDIR(info.st_mode))  
                            {  
                                printf("%s\n", direntp->d_name);  
      
                                strcpy (dirs[dir_count],complete_d_name);  
                                dir_count++;  
                            }  
                            else  
                            {  
                                printf("%s\n", direntp->d_name);  
                            }  
                        }  
      
                    }  
                }  
      
                if(mode == R)  
                {  
                    int i=0;  
                    printf("\n");  
                    for(;i<dir_count;i++){  
                        printf("%s:\n", dirs[i]);  
                        do_ls(dirs[i],R);  
                        printf("\n");  
                    }  
                }  
      
            }  
      
            closedir(dir_ptr);  
        }  
    }  
    int analyzeParam(char* input){  
        if(strlen(input)==2)  
        {  
            if(input[1]=='l') return L;  
            if(input[1]=='a') return A;  
            if(input[1]=='d') return D;  
            if(input[1]=='R') return R;  
            if(input[1]=='i') return I;  
        }  
        else if(strlen(input)==3)  
        {  
            if(input[1]=='a'&& input[2]=='l') return AL;  
            if(input[1]=='a'&& input[2]=='i') return AI;  
        }  
        return -1;  
    }  
      
    int main(int ac,char* av[])  
    {  
      
        if(ac == 1)  
        {  
            do_ls(".",LS_NONE);  
        }  
        else  
        {  
            int mode = LS_NONE; // 默认为无参数ls  
            int have_file_param = 0; 
      
            while(ac>1)  
            {  
                ac--;  
                av++;  
      
                int calMode = analyzeParam(*av);  
                if(calMode!=-1)  
                {  
                    mode+=calMode;  
                }  
                else  
                {  
                    have_file_param = 1;  
                    do  
                    {  
                        printf("%s:\n", *av);  
                        do_ls(*av,mode);  
                        printf("\n");  
      
                        ac--;  
                        av++;  
                    }while(ac>=1);  
                }  
            }  
      
            if (!have_file_param)  
            {  
                do_ls(".",mode);  
            }  
              
        }       
    }  

标签:info,name,实现,char,ls,str,printf,mode
From: https://www.cnblogs.com/sanfeng-ooo/p/16792938.html

相关文章

  • 力扣 两数之和 Go实现
    自己写的就比较暴力,直接两层循环,第一层从0开始,第二层从当前的下一位开始。看了别人的解析好多都是用哈希表实现的,按着别人的解析也写了一个。1functwoSum(nums[]int,......
  • 2022-2023-1 20201324《信息安全系统设计与实现(上)》第4章
    目录1并发计算导论(1)顺序算法与并行算法(2)并行性与并发性2线程(1)线程的原理(2)线程的优点(3)线程的缺点3线程操作4线程管理函数(1)创建线程(2)线程ID(3)线程终止(4)线程连接(5)用线程快......
  • 实现Android深度加固:代码、资源、so库加密隐藏。兼容unity引擎和各种机型
    1.为什么做加固因为不想辛辛苦苦做的东西,被别人拿去改成各种版,半路摘我的桃子。2.怎么加固2.1简单的加固三方加固,有些三方会有免费版本的加固服务比如腾讯加固2.2......
  • django models 过滤/排除指定字段的多个值
    fromoperatorimportor_fromdjango.db.modelsimportQfromfunctoolsimportreducefilter_ip_list=["不能为空"]#排除models.ServerHost.objects.filter(b......
  • C++实现太阳系行星系统
    实验楼项目:C++实现太阳系行星系统关于详细知识跟着实验做比较好基础知识做这个项目需要知道一些基础知识:OpenGLGLUT类设计main.cpp#include<GL/glut.h>#include......
  • Demo:下载模板 02 使用SAP_CONVERT_TO_XLS_FORMAT
    货铺QQ群号:834508274进群统一修改群名片,例如BJ_ABAP_森林木。群内禁止发广告及其他一切无关链接,小程序等,进群看公告,谢谢配合不修改昵称会被不定期踢除,谢谢配合有批导需求的......
  • 在 Kubernetes 中实现微服务应用监控
    张坚,科大讯飞开发工程师,云原生爱好者。本篇文章我们基于Prometheus和Grafana实现微服务应用监控。KubeSphere平台本身提供了监控功能,包括节点状态、集群资源使......
  • win11+wls2+ubuntu2004配置cuda+cudnn+pytorch
    0.前置说明win11系统开启子系统wsl2安装Ubuntu2004版本子系统(2204版本未测试,请自测)1.安装wsl2-Ubuntu2004子系统win11以上默认是wsl2了,win10参考列表第一个子系统......
  • LcdTools如何编写MIPI指令(初始化代码)
    在LcdTools帮助文档中查看MIPI读写指令描述,如下图    编写LCM初始化代码就是配置LCMDriverIC寄存器值,一般只需用MipiWrite()指令写参数即可;下面......
  • php简单实现 远程图片 上传
     思路:服务器A:上传文件,获取临时路径,然后获取base64字符串,将base64字符串发给服务器B服务器B:接受base64字符串,转码后使用file_put_contents添加到文件内,即可实......