模拟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 ",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 [目录路径] ",argv[0]); return 0; } if(argc==2)//命令行带了目录路径 { if( chdir(argv[1])==-1)//设为当前目录 { perror("错误"); return -1; } } listDetial();//列出相信信息 }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了