模拟实现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>
#include<string.h>
//模拟实现ls-l指令
//-rw-rw-r-- 1 ethan ethan 12 4月  19 16:31 a.txt
int main(int argc,char * argv[])
{
    if(argc<2)
    {
        printf("%s filename\n",argv[0]);
        return -1;
    }
    struct stat st;
    int ret = stat(argv[1],&st);
    if(ret==-1){
        perror("stat");
        return -1;
    }

    //获取文件类型和文件权限
    char perms[11]={0};//用于保存文件类型和文件权限的字符串

    switch(st.st_mode & S_IFMT){
        case S_IFLNK:
            perms[0]='l';
            break;
        case S_IFDIR:
            perms[0]='d';
            break;
        case S_IFREG:
            perms[0]='-';
            break;
        case S_IFBLK:
            perms[0]='b';
            break;
        case S_IFCHR:
            perms[0]='c';
            break;
        case S_IFSOCK:
            perms[0]='s';
            break;
        case S_IFIFO:
            perms[0]='p';
            break;
        default:
            perms[0]='?';
            break;
    }    

    //判断文件的访问权限

    //判断文件所有者
    perms[1]=(st.st_mode&S_IRUSR) ? 'r' :'_';
    perms[2]=(st.st_mode&S_IWUSR) ? 'w' :'_';
    perms[3]=(st.st_mode&S_IXUSR) ? 'x' :'_';
    
    //判断文件所在组
    perms[4]=(st.st_mode&S_IRGRP) ? 'r' :'_';
    perms[5]=(st.st_mode&S_IWGRP) ? 'w' :'_';
    perms[6]=(st.st_mode&S_IXGRP) ? 'x' :'_';

    //其他人
    perms[7]=(st.st_mode&S_IROTH) ? 'r' :'_';
    perms[8]=(st.st_mode&S_IWOTH) ? 'w' :'_';
    perms[9]=(st.st_mode&S_IXOTH) ? 'x' :'_';
    
    //硬连接数
    int linkNum=st.st_nlink;

    //文件所有者
    char * fileUser=getpwuid(st.st_uid)->pw_name;
    
    char * fileGrp=getgrgid(st.st_gid)->gr_name;

    //文件大小
    long int fileSize=st.st_size;

    //获取修改的时间
    char *time=ctime(&st.st_mtime);
    
    char mtime[512]={0};
    strncpy(mtime,time,strlen(time)-1);

    char buf[1024];
    sprintf(buf,"%s %d %s %s %ld %s %s",perms,linkNum,fileUser,fileGrp,fileSize,mtime,argv[1]);

    printf("%s\n",buf);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值