今天天气不错,实现个自己的 ls 命令玩玩,现在实现来 -l 参数,以后有空再把其他参数补全:)
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <dirent.h> 5 #include <string.h> 6 #include <pwd.h> 7 #include <time.h> 8 9 void showls(struct stat *p,char * d_name) 10 { 11 char flag; 12 if(S_ISREG(p->st_mode))flag=‘-‘; 13 else if(S_ISDIR(p->st_mode))flag=‘d‘; 14 else if(S_ISCHR(p->st_mode))flag=‘c‘; 15 else if(S_ISBLK(p->st_mode))flag=‘b‘; 16 else if(S_ISFIFO(p->st_mode))flag=‘P‘; 17 else if(S_ISLNK(p->st_mode))flag=‘l‘; 18 else flag=‘?‘; 19 printf("%c\t",flag); 20 21 printf("%o\t",p->st_mode&0777); 22 23 printf("%d\t",p->st_nlink); 24 25 struct passwd *s; 26 s=getpwuid(p->st_uid); 27 printf("%s\t",s->pw_name); 28 29 printf("%ld\t",p->st_size); 30 31 char buf[100]; 32 time_t t=p->st_mtime; 33 strftime(buf,sizeof(buf),"%F %T",localtime(&t)); 34 printf("%s\t",buf); 35 36 printf("%s\t",d_name); 37 printf("\n"); 38 } 39 40 int main(int argc,char* argv[]) 41 { 42 char* path; 43 if(argc==1) 44 path="."; 45 if(argc==2) 46 path=argv[1]; 47 if(argc==3) 48 path=argv[2]; 49 50 if(argc>=2&&strcmp(argv[1],"-l")==0) 51 { 52 if(strcmp(argv[1],"-l")==0&&argc==2) 53 path="."; 54 if(opendir(path)==NULL) 55 { 56 printf("文件打开失败!请正确输入!"); 57 printf("%m"); 58 return -1; 59 } 60 DIR *p = opendir(path);//指针指向当前路径的所有内容 61 chdir(path); 62 struct dirent *q;//结构体划分内容块 63 printf("类型\t权限\t链接数\t用户名\t字节数\t最后一次修改时间\t文件名\n"); 64 while((q=readdir(p))!=NULL) 65 { 66 struct stat s; 67 stat(q->d_name,&s); 68 if(q->d_name[0]==‘.‘) 69 continue;//不显示隐藏文件 70 showls(&s,q->d_name); 71 } 72 printf("\n"); 73 closedir(p); 74 return 0; 75 } 76 if(opendir(path)==NULL) 77 { 78 printf("文件打开失败!请正确输入!"); 79 printf("%m"); 80 return -1; 81 } 82 DIR *p = opendir(path); 83 chdir(path); 84 struct dirent *q; 85 while((q=readdir(p))!=NULL) 86 { 87 if(q->d_name[0]==‘.‘) 88 continue;//不显示隐藏文件 89 printf("%s\t",q->d_name); 90 } 91 printf("\n"); 92 closedir(p); 93 return 0; 94 }
执行结果:
时间: 2024-12-28 08:47:32