参见附图,改进你的ls的实现。提交代码运行截图和码云链接。

#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 LS_L 101
#define LS_R 102
#define LS_D 103
#define LS_I 104
#define LS_A 200
#define LS_AL (LS_A+LS_L)
#define LS_AI (LS_A+LS_I)  

// 展示单个文件的详细信息
void show_file_info(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==LS_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 == LS_L||mode == LS_AL)
                    {
                        show_file_info(direntp->d_name, &info);
                    }
                    else if(mode == LS_A||mode == LS_NONE||mode == LS_I||mode == LS_AI)
                    {
                        if(mode == LS_I||mode == LS_AI)
                        {
                            printf("%llu ", direntp->d_ino);
                        }  

                        printf("%s\n", direntp->d_name);
                    }
                    else if(mode == LS_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 == LS_R)
            {
                int i=0;
                printf("\n");
                for(;i<dir_count;i++){
                printf("%s:\n", dirs[i]);
                do_ls(dirs[i],LS_R);
                printf("\n");
                }
            }
        }
        closedir(dir_ptr);
    }
}  

// 解析一个单词参数,如-l,-i
int analyzeParam(char* input){
    if(strlen(input)==2)
    {
        if(input[1]==‘l‘) return LS_L;
        if(input[1]==‘a‘) return LS_A;
        if(input[1]==‘d‘) return LS_D;
        if(input[1]==‘R‘) return LS_R;
        if(input[1]==‘i‘) return LS_I;
    }
    else if(strlen(input)==3)
    {
        if(input[1]==‘a‘&& input[2]==‘l‘) return LS_AL;
        if(input[1]==‘a‘&& input[2]==‘i‘) return LS_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);
        }
    }
}

原文地址:https://www.cnblogs.com/fakerli/p/12105440.html

时间: 2024-10-21 08:16:55

参见附图,改进你的ls的实现。提交代码运行截图和码云链接。的相关文章

实现ls及ls的改进ls的实现

ls的实现及改进ls的实现 参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接. 打开目录文件 针对目录文件 读取目录条目 显示文件名 关闭文件目录文件 ls实现代码: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #i

20145234黄斐《java程序设计》实验四

实验过程: JDK.Android Studio的安装: 参见卢晓明博客:http://www.cnblogs.com/lxm20145215----/p/5444207.html 注意事项:解决Fetching android sdk component information加载过久问题 安装完成后,如果直接启动,Android Studio会去获取 android sdk 组件信息,这个过程相当慢,还经常加载失败,导致Android Studio启动不起开.解决办法就是不去获取androi

20172319 实验二《树》实验报告

20172319 2018.11.04-11.12 实验二<树> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:20172319 实验教师:王志强老师 课程助教:张师瑜学姐.张之睿学长 实验时间:2018年11月04日--2018年11月12日 必修/选修:必修 目录 实验内容 实验要求 实验步骤 代码实现及解释 测试过程及遇到的问题 分析总结 代码托管 参考资料 实验内容 实验二-1-实现二叉树: 完成链树LinkedBinaryT

20165214 结队编程项目-四则运算(第二周)

20165214 第一次结队编程项目--四则运算第二周 需求分析 本周的结队编程想要实现一个四则运算系统,它可以自动生成n个计算题(本周不包括分数),其中n由我们输入.每输出一道题目,运行程序的人需要输入相应的答案,直到最后一道题做完.最后,统计正确率.然后,在这个基础上可以进行相应的功能扩展,比如语言支. 设计思路 我需要在上周的基础上对程序进行补充.在题目的生成上,应该再加上括号.÷./ 本周达成: ①能够随机生成n道题目,n由我们输入,最大长度可直接在程序里面修改: ②支持真分数运算: ③

20172329 2017-2018-2 《程序设计与数据结构》实验五报告

这是这学期最后一次实验了,也是学到了很多东西,希望自己可以可以善始善终,加油! 让我们开始这一篇博客吧! 20172329 2017-2018-2 <程序设计与数据结构>实验五报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 王文彬 学号:20172329 实验教师:王志强 实验日期:2018年6月11日 必修/选修: 必修 一.实验内容 1.网络编程与安全-1 两人一组结对编程: a. 参考http://www.cnblogs.com/rocedu/p/6766748

20172321 2017-2018-2 《程序设计与数据结构》实验五报告

20172321 2017-2018-2 <程序设计与数据结构>实验五报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 吴恒佚 学号:20172321 实验教师:王志强 实验日期:2018年6月13日~2018年6月18日 必修/选修: 必修 一.实验内容 1.网络编程与安全-1 两人一组结对编程: a. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA b. 结对实现中缀表达式转后缀表达式的功能 MyBC.ja

20175308实验五《网络编程与安全》实验报告

20175308实验五<网络编程与安全>实验报告 实验内容 任务一 任务要求 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java 上传测试代码运行结果截图和码云链接 实验过程 中缀转后缀以及后缀式计算的内容从结对到选做题已完成多次,这里不做阐述,详情参见 结对博客 实验截图 任务

20175202 实现ls

一.任务要求: 1.参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接. 2.打开目录文件 针对目录文件 读取目录条目 显示文件名 关闭文件目录文件 二.我要实现的ls功能: 1.ls:显示文件目录列表 2.-a:显示所有的文件,包括隐藏文件 3.-l:列出长数据串,显示出文件的属性与权限等数据信息(常用) 4.-i:结合-l参数列出每个文件的inode 5.-d:仅列出目录本身,而不是列出目录里的内容列表 三.产品代码: #include <stdio.h> #includ

20145326蔡馨熤《信息安全系统设计基础》期末总结

20145326蔡馨熤<信息安全系统设计基础>期末总结 每周作业链接汇总 第0周作业 简要内容:初步翻阅课本,提出问题:学会如何使用虚拟机VirtualBox并成功安装Ubantu:预习了Linux基础入门:阅读了老师推荐的博客并写出了自己的感想. 二维码: 第1周作业 简要内容:初步了解Linux操作系统:介绍了核心的Linux命令:find/locate/cheat/grep/which/whereis. 二维码: 第2周作业 简要内容:介绍了Linux系统下的开发环境.vi的基本操作.g