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

来源:互联网 发布:学java跟不上 编辑:程序博客网 时间:2024/05/22 04:39

话不多说 上代码:

/*************************************************************************> 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:dvoid 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 0
原创粉丝点击