2019 3 15 付铖

本文详细介绍了一个自制的ls命令实现过程,包括如何使用各种系统调用和库函数来模仿ls命令的功能,如显示目录内容、文件属性等。文章深入探讨了如何处理不同类型的文件和目录,以及如何解析和执行命令行选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
1.尝试实现ls命令的功能 加选项-l -a -i -h
*/

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

int l_stat(char * p1,char * p);
void a_stat(char * p);
void i_stat(char * p);
void e_dir(char * p);

static long numbers;
//判断是否隐藏文件
int is_spot(const char * p)
{
    if(*p == '.')
        return 1;
    else
        return 0;
}
void e_dir(char * p)
{
    struct stat  mystat;
    DIR * dir;
    struct dirent * pd;
    int cent = stat(p,&mystat);
    if((mystat.st_mode & S_IFMT) == S_IFDIR)
    {
        dir = opendir(p);
        if(dir == NULL)
        {
            if(errno)
            {
                perror("opendir()");
                return;
            }
        }
        while(1)
        {
            pd = readdir(dir);
            if(pd == NULL)
            {
                if(errno)
                {
                    perror("readdir()");
                    return ;
                }
                break;
            }

            l_stat(p,pd->d_name);
        }
        closedir(dir);
    }
    else
        l_stat(".",p);
    printf("%ldk\n",numbers/2);
    return ;
    
}
void h_stat(char * p)
{
    struct stat  mystat;
    DIR * dir;
    struct dirent * pd;
    int cent = stat(p,&mystat);
    if((mystat.st_mode & S_IFMT) == S_IFDIR)
    {
        dir = opendir(p);
        if(dir == NULL)
        {
            if(errno)
            {
                perror("opendir()");
                return;
            }
        }
        while(1)
        {
            pd = readdir(dir);
            if(pd == NULL)
            {
                if(errno)
                {
                    perror("readdir()");
                    return ;
                }
                break;
            }
            if(is_spot(pd->d_name) == 0)
                printf("%s    \n",pd->d_name);
        }
        closedir(dir);
    }
    else
        printf("%s    \n",p);

    return;
}
int main(int argc,char ** argv)
{
    if(argc < 3)
        return 1;
    char * op = "-laih";
    int s;
    while(1)
    {
        s = getopt(argc,argv,op);
        if(s == -1)
            break;
        switch(s)
        {
            case 'l':e_dir(argv[2]); break;
            case 'a':a_stat(argv[2]);break;
            case 'i':i_stat(argv[2]);break;
            case 'h':h_stat(argv[2]);break;
            case '?':printf("无该选项\n");break;
        //    case 1  : printf("%s\n",argv[2]);break;
            default:break;
        }
    }
    return 0;
}
void i_stat(char * p)
{
    struct stat mystat;
    int nodenumber;
    DIR * dir;
    struct dirent * pd;
    int cent = stat(p,&mystat);
    if((mystat.st_mode & S_IFMT) == S_IFDIR)
    {
        dir = opendir(p);
        if(dir == NULL)
        {
            if(errno)
            {
                perror("opendir()");
                return;
            }
        }
        while(1)
        {
            pd = readdir(dir);
            if(pd == NULL)
            {
                if(errno)
                {
                    perror("readdir()");
                    return ;
                }
                break;
            }
            if(is_spot(pd->d_name) == 0)
            {
                printf("%ld        ",pd->d_ino);
                printf("%s\n",pd->d_name);
            }
        }
        closedir(dir);
    }
    else
    {
        printf("%ld        ",mystat.st_ino);
        printf("%s\n",p);
    }
}

void a_stat(char * p)
{
    struct stat  mystat;
    DIR * dir;
    struct dirent * pd;
    int cent = stat(p,&mystat);
    if((mystat.st_mode & S_IFMT) == S_IFDIR)
    {
        dir = opendir(p);
        if(dir == NULL)
        {
            if(errno)
            {
                perror("opendir()");
                return;
            }
        }
        while(1)
        {
            pd = readdir(dir);
            if(pd == NULL)
            {
                if(errno)
                {
                    perror("readdir()");
                    return ;
                }
                break;
            }
            printf("%s     ",pd->d_name);
        }
    }
    else
        printf("%s     ",p);
}



char * dir_cat(const char * p,const char * buf)
{
    char * buf_cat = malloc(100);
    memset(buf_cat,'\0',100);
    strcpy(buf_cat,p);
    buf_cat[strlen(buf_cat)] = '/';
    strcat(buf_cat,buf);
    return buf_cat;
}
int l_stat(char * p,char * p_name)
{
    struct tm * tmp = NULL;
    struct passwd * pwd = NULL;
    struct group * wd = NULL;
    struct stat  mystat;
    char buf[100];
    char * p1;
    int cnt;
    p1 = dir_cat(p,p_name);
    cnt = stat(p1,&mystat);
    
    if(cnt == -1)
    {
        perror("stat()");
        return -1;
    }

    if(is_spot(p_name) == 0)
    {
        numbers += mystat.st_blocks;
        switch(mystat.st_mode & S_IFMT)
        {
            case S_IFREG: putchar('-');break;
            case S_IFBLK: putchar('b');break;
            case S_IFDIR: putchar('d');break;
            case S_IFCHR: putchar('c');break;
            case S_IFIFO: putchar('p');break;
            default:break;
        }
        //拥有者
        if(mystat.st_mode & S_IRUSR)
            putchar('r');
        else
            putchar('-');

        if(mystat.st_mode & S_IWUSR)
            putchar('w');
        else
            putchar('-');

        if(mystat.st_mode & S_IXUSR)
            putchar('x');
        else
            putchar('-');
        //所属组
        if(mystat.st_mode & S_IRGRP)
            putchar('r');
        else
            putchar('-');

        if(mystat.st_mode & S_IWGRP)
            putchar('w');
        else
            putchar('-');

        if(mystat.st_mode & S_IXGRP)
            putchar('x');
        else
            putchar('-');
        //其他
        if(mystat.st_mode & S_IROTH)
            putchar('r');
        else
            putchar('-');
        if(mystat.st_mode & S_IWOTH)
            putchar('w');
        else
            putchar('-');
        if(mystat.st_mode & S_IXOTH)
            putchar('x');
        else
            putchar('-');
        //硬链接个数
        printf("%2ld ",mystat.st_nlink);
        //文件拥有者名字
        pwd = getpwuid(mystat.st_uid);
        printf("%s ",pwd->pw_name);
        //文件所属组
        wd = getgrgid(mystat.st_gid);
        printf("%s ",wd->gr_name);
        //总字节个数
        printf("%5ld ",mystat.st_size);
        //获取时间
        tmp = localtime(&mystat.st_mtim.tv_sec);
        strftime(buf,100,"%m月  %d %H:%M",tmp);
        printf("%s ",buf);
        //文件名
        printf("%s\n",p_name);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/fc724/p/10536396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值