Linux下实现ls功能

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

//struct tm *mytime=(struct tm*)malloc(sizeof(struct tm));

void Normal(DIR* dir,struct dirent* ptr, int cnt){
        while((ptr=readdir(dir))!=NULL){
            if(strcmp(ptr->d_name,".")==0||strcmp(ptr->d_name,"..")==0||ptr->d_name[0]=='.')continue;
            cnt++;
            printf("%s  ",ptr->d_name);
            if(cnt%10==0)printf("\n");
        }
        printf("\n");
}

void DetailF(struct stat buf, char a[]){
        char res[12];
        if(S_ISLNK(buf.st_mode))res[0]='l';
        else if(S_ISREG(buf.st_mode))res[0]='-';
        else if(S_ISDIR(buf.st_mode))res[0]='d';
        else if(S_ISCHR(buf.st_mode))res[0]='c';
        else if(S_ISBLK(buf.st_mode))res[0]='b';
        else if(S_ISFIFO(buf.st_mode))res[0]='f';
        else if(S_ISSOCK(buf.st_mode))res[0]='s';

        if(buf.st_mode&S_IRUSR)res[1]='r';
        else res[1]='-';
        if(buf.st_mode&S_IWUSR)res[2]='w';
        else res[2]='-';
        if(buf.st_mode&S_IXUSR)res[3]='x';
        else res[3]='-';

        if(buf.st_mode&S_IRGRP)res[4]='r';
        else res[4]='-';
        if(buf.st_mode&S_IWGRP)res[5]='w';
        else res[5]='-';
        if(buf.st_mode&S_IXGRP)res[6]='x';
        else res[6]='-';

        if(buf.st_mode&S_IROTH)res[7]='r';
        else res[7]='-';
        if(buf.st_mode&S_IWOTH)res[8]='w';
        else res[8]='-';
        if(buf.st_mode&S_IXOTH)res[9]='x';
        else res[9]='-';
        res[10]='\0';
        printf("%s", res);
        printf("  %5ld",buf.st_nlink);
        printf("  %s",getpwuid(buf.st_uid)->pw_name);
        printf("  %s",getgrgid(buf.st_gid)->gr_name);
        printf("  %5ld",buf.st_size);

        char* time_st=ctime(&buf.st_mtime);
        time_st[strcspn(time_st, "\n")]=0;
        printf("  %s",time_st);
        printf("  %s",a);
        printf("\n");
}

void DetailD(DIR* dir, struct dirent* ptr, char d[]){
        struct stat buf;
        char a[1024];
        while((ptr=readdir(dir))!=NULL){
                if(strcmp(ptr->d_name,".")==0||strcmp(ptr->d_name,"..")==0||ptr->d_name[0]=='.')continue;
                if(strcmp(d, "/")!=0)
                sprintf(a, "%s%s%s", d,"/",ptr->d_name);
                else sprintf(a, "%s%s", d, ptr->d_name);

                stat(a, &buf);
                DetailF(buf, ptr->d_name);
        }
}
int main(int argc, char* argv[]){
    DIR *dir;
    struct dirent* ptr;
    struct stat buf;
    if(argc==1){
        stat(".", &buf);
        dir=opendir(".");
        int cnt=0;
        Normal(dir, ptr, cnt);
        closedir(dir);
    }

    if(argc>=2&&strcmp(argv[1], "-l")!=0){
        int cnt=0;
        for(int i=1; i<argc; i++){
                stat(argv[i], &buf);
                if(!S_ISDIR(buf.st_mode)){
                        cnt++;
                        printf("%s  ",argv[i]);
                        if(cnt%10==0)printf("\n");
                }
                else{
                        dir=opendir(argv[i]);
                        Normal(dir, ptr, cnt);
                        closedir(dir);
                }
        }

        printf("\n");
    }

    if(argc>=2&&strcmp(argv[1], "-l")==0){
        int cnt=0;
        if(argc==2){
                stat(".", &buf);
                dir=opendir(".");
                DetailD(dir, ptr, ".");
                closedir(dir);
        }
        else{
                for(int i=2; i<argc; i++){
                        stat(argv[i], &buf);
                        if(!S_ISDIR(buf.st_mode))
                        DetailF(buf,argv[i]);
                        else{
                                dir=opendir(argv[i]);
                                DetailD(dir, ptr,argv[i]);
                                closedir(dir);
                        }
                }
        }
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值