在终端实现一个ls -l的功能

代码:

#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
//构造文件权限转化字符形式函数
void change_mod(mode_t m)
{
    //创建一个储存'r''w''x'的数组用来提取'r''w''x'
    char arr[]="rwx";
    //循环对比权限的八进制数和rwx
    for(int i=0;i<9;i++)
    {
        if((m&(0400>>i))==0)
        {
            putchar('-');
        }
        else
        {
            fprintf(stdout,"%c",arr[i%3]);
        }
        
    }
}

//构造文件类型转为字符函数
void change_type(mode_t n)
{
    switch(S_IFMT&n)
    {
        case S_IFSOCK:
            putchar('s');
            break;
        case S_IFLNK:
            putchar('l');
            break;
        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: printf("mode错误\n");
    }
}

//封装uid转字符类型函数
void change_uid(uid_t a)
{
    struct passwd* b=getpwuid(a);
    printf(" %s ",b->pw_name);
}

//封装gid转字符类型函数
void change_gid(uid_t a)
{
    struct group* b=getgrgid(a);
    printf("%s ",b->gr_name);
}

//封装时间转日历格式函数
void time_size(time_t a)
{
    struct tm* b=localtime(&a);
    //定义一个中文月份的数组
    char *arr[13]={0,0,0};
    arr[0]="一月";
    arr[1]="二月";
    arr[2]="三月";
    arr[3]="四月";
    arr[4]="五月";
    arr[5]="六月";
    arr[6]="七月";
    arr[7]="八月";
    arr[8]="九月";
    arr[9]="十月";
    arr[10]="十一";
    arr[11]="十二";
    fprintf(stdout,"%s %d %02d:%02d ",arr[b->tm_mon],b->tm_mday,b->tm_hour,b->tm_min);

}









/***************************************主函数***********************************************/

int main(int argc, const char *argv[])
{
    struct stat buf;     //设置stat结构体类型的变量
    //提取文件所有属性
    stat("./typefile.c",&buf);    //通过变量取地址来存储文件属性
    //通过结构体变量访问文件类型+文件权限
    printf("%o\n",buf.st_mode);
    //调用文件权限转化字符形式函数
    change_mod(buf.st_mode);
    //调用文件类型转化为字符形式函数
    change_type(buf.st_mode);
    
    
    
    //通过结构体变量访问硬连接数
    printf("%ld\n",buf.st_nlink);

    //通过结构体变量访问用户名
    printf("%d\n",buf.st_uid);
    //调用uid转字符函数
    change_uid(buf.st_uid);



    //通过结构体变量访问用户组名
    printf("typefile.c\n");
    printf("%d\n",buf.st_gid);
    //调用gid转字符函数
    change_gid(buf.st_gid);



    //通过结构体变量访问文件大小
    printf("%ld",buf.st_size);


    //通过结构体变量访问日期
    printf("%ld\n",buf.st_atime);


    //输出文件名
    printf("typefile.c\n");


    printf("各功能展示完毕,下面展示终端ls -l最终效果>>>>>>>>>\n");
    printf("**************************************************\n");
    printf("**************************************************\n");
    printf("**************************************************\n");
    printf("**************************************************\n");
    //文件类型
    
    change_type(buf.st_mode);
    //文件权限
    change_mod(buf.st_mode);
    
    //uid
    change_uid(buf.st_uid);
    
    //gid
    change_gid(buf.st_gid);
    
    //文件大小
    printf("%ld ",buf.st_size);
    
    //日期
    time_size(buf.st_atime);
    
    //文件名
    printf("typefile.c\n");

    return 0;
}

效果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值