使用C语言实现Linux命令ls -l

在这里插入图片描述

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <stdlib.h>

int ls(char *str);
int ls_long(char *str, char *argv);
char getFileType(int st_mode);
char* getPower(int st_mode);
char* getUsername(int uid);
char* getGroupname(int gid);

int main(int argc, char *argv[]){
        if (argc == 1){
                // only ls
                int status;
                status = ls(".");
                if (status == -1)
                        printf("Error: file can't open\n");
                return 0;
        }

        if (argc == 2){
                // current dir & have parameter 
                if (argv[1][0] == '-'){
                        int status;
                        status = ls_long(".", argv[1]);
                        if (status == -1)
                                printf("Error: file can't open\n");
                        if (status == 0){
                                printf("Error: input parameter error\n");
                        }
                }else{// appoint dir
                        printf("apponit dir\n");
                        int status;
                        status = ls(argv[1]);
                        if (status == -1){
                                printf("Error: file can't open\n");
                        }
                }
                return 0;
        }

        // have parameter & appoint dir
        if (argc >= 3){
                int status;
                status = ls_long(argv[1], argv[2]);
                if (status == -1)
                        printf("Error: file can't open\n");
                if (status == 0)
                        printf("Error: input parameter error\n");
                return 0;
        }
        return 0;
}

int ls(char *str){
        DIR *dirp;
        struct dirent *dp;
        dirp = opendir(str);
        //int i = 0;

        if (readdir(dirp) == NULL){
                return -1;
        }

        while ((dp = readdir(dirp)) != NULL){
                printf("%s\n", dp -> d_name);
                /*
                ++i;
                if(i % 6 == 0)
                        printf("\n");*/
        }
        //printf("\n");
        closedir(dirp);
        return 1;
}

int ls_long(char *str, char *argv){
        DIR *dirp;
        struct dirent *dp;
        dirp = opendir(str);

        if (readdir(dirp) == NULL){
                return -1;
        }

        int len;        
        len = strlen(argv);
        int i;
        int flag = 0;
        for(i = 1; i < len; i++){
                if (argv[i] == 'l')
                        flag = 1;
        }

        if (flag == 0)
                return 0;
        chdir(str);
        while ((dp = readdir(dirp)) != NULL){
                struct stat buf;
                int st;
                st = stat(dp -> d_name, &buf);
                if (st == -1)
                        return -1;
                char type;
                type = getFileType(buf.st_mode);
                char power[9];
                int j;
                char* p = getPower(buf.st_mode);
                for (j = 0; j < 9; j++){
                        power[j] = *(p + j);
                }
                char* username = getUsername(buf.st_uid);
                char* groupname = getGroupname(buf.st_gid);

                // get time
                struct tm* t;
                t = localtime(&buf.st_mtime);

                printf("%c%s\t%d\t%s\t%s\t%d\t%02d月 %02d %02d:%02d\t%s\n",type, power, buf.st_nlink, username, groupname, buf.st_size, t -> tm_mon + 1, t -> tm_mday, t -> tm_hour, t -> tm_min, dp -> d_name);
        }
        closedir(dirp);
        return 1;
}

char getFileType(int st_mode){
        if ((st_mode & S_IFREG) == S_IFREG){// Ordinary file
                return '-';
        }else if ((st_mode & S_IFDIR) == S_IFDIR){// directory
                return 'd';
        }
        else if ((st_mode & S_IFLNK) == S_IFLNK){// symbolic link
                return 'l';
        }else if ((st_mode & S_IFSOCK) == S_IFSOCK){// socket
                return 's';
        }else if ((st_mode & S_IFBLK) == S_IFBLK){// block device
                return 'b';
        }else {// character device
                return 'c';
        }
}

char* getPower(int st_mode){
        char *power = (char*)malloc(10);
        if ((st_mode & S_IRUSR) == S_IRUSR){// File owner
                power[0] = 'r';
        }else{
                power[0] = '-';
        }

        if ((st_mode & S_IWUSR) == S_IWUSR){
                power[1] = 'w';
        }else{
                power[1] = '-';
        }

        if ((st_mode & S_IXUSR) == S_IXUSR){
                power[2] = 'x';
        }else{
                power[2] = '-';
        }

        if ((st_mode & S_IRGRP) == S_IRGRP){// user group
                power[3] = 'r';
        }else{
                power[3] = '-';
        }

        if ((st_mode & S_IWGRP) == S_IWGRP){
                power[4] = 'w';
        }else{
                power[4] = '-';
        }

        if ((st_mode & S_IXGRP) == S_IXGRP){
                power[5] = 'x';
        }else{
                power[5] = '-';
        }

        if ((st_mode & S_IROTH) == S_IROTH){// other user
                power[6] = 'r';
        }else{
                power[6] = '-';
        }

        if ((st_mode & S_IWOTH) == S_IWOTH){
                power[7] = 'w';
        }else{
                power[7] = '-';
        }

        if((st_mode & S_IXOTH) == S_IXOTH){
                power[8] = 'x';
        }else{
                power[8] = '-';
        }
        power[9] = '\0';
        return power;
}

char* getUsername(int uid){
        struct passwd *my_info;
        my_info = getpwuid(uid);
        return (my_info -> pw_name);
}

char* getGroupname(int gid){
        struct group *group_info;
        group_info = getgrgid(gid);
        return (group_info -> gr_name);
}

运行截图
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值