模拟ls -l命令简易代码demo

话不多说 上代码:

/*************************************************************************
	> File Name: ls-l.c
	> Author: 
	> Mail: 
	> Created Time: Wed 08 Mar 2017 05:32:08 AM PST
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<dirent.h>
#include<pwd.h>
#include<grp.h>
#include<string.h>
#include<time.h>
#include<sys/stat.h>
// a a/b a/c cur:a
// ls a:b,c
// ls b:XXX
// ls a/b:d
// cd a; ls b:d
void printtype(int mode)
{
    if(S_ISREG(mode)) putchar('-');
    else if(S_ISDIR(mode)) putchar('d');
    else if(S_ISLNK(mode)) putchar('l');
    else if(S_ISFIFO(mode)) putchar('p');
    else if(S_ISSOCK(mode)) putchar('s');
    else if(S_ISCHR(mode)) putchar('c');
    else if(S_ISBLK(mode)) putchar('b');
    else  putchar('@');
}
void printaccess(int mode)
{//rwxrwxrwx
 const char* acc ="rwx";
 int i;
 for(i = 0;i<9;i++,mode<<=1)//mode = mode<<1
     putchar(mode&0400?acc[i%3]:'-');
}
void showdetail(const char* name)
{
    struct stat s;
    lstat(name,&s);
    printtype(s.st_mode);//打印类型
    printaccess(s.st_mode&0777);//打印权限
    printf("%2d",s.st_nlink);
    printf("%7s",getpwuid(s.st_uid)->pw_name);
    printf("%7s",getgrgid(s.st_gid)->gr_name);
    printf("%5lu",s.st_size);
    char buff[20];
    strftime(buff,sizeof(buff),"%F %T",localtime(&s.st_mtime));
    printf("%20s %s\n",buff,name);
}
void listDetial(void)
{
    DIR* p =opendir(".");//已经设为当前目录,打开即可
    if(NULL==p)
    {
        perror("opendir");
        return;
    }
    struct dirent* q=NULL;
    while((q=readdir(p))!=NULL)
    {
       if(q->d_name[0]=='.') continue;
            //列出详细信息
            showdetail(q->d_name);
    }
}
int main(int argc,char* argv[])
{
    if(argc>2)
    {
        printf("%s [目录路径]\n",argv[0]);
        return 0;
    }
    if(argc==2)//命令行带了目录路径
    {
       if( chdir(argv[1])==-1)//设为当前目录
        {
            perror("错误");
            return -1;
        }
    }
    listDetial();//列出相信信息
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值