简单,不易于使用的myls
作者:互联网
main.c 文件 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <glob.h> 5 #include <error.h> 6 #include <dirent.h> 7 #include "myls.h" 8 9 void stat_attbute(struct stat *buf); 10 int is_not_dir(char *name); 11 12 int main(int argc, char **argv) 13 { 14 int ch = 0; 15 struct stat buf; 16 char path[1024]; 17 DIR *dp = NULL; 18 struct dirent * ret; 19 20 char *optstring = "-lia"; 21 22 while(ch != -1) 23 { 24 ch = getopt(argc, argv, optstring); 25 26 if(argv[1] == NULL && ch == -1) 27 { 28 ch = 'm'; 29 strcpy(path, "."); 30 } 31 else 32 if(ch == 1) 33 34 strcpy(path,argv[optind - 1]); 35 36 dp = opendir(path); 37 38 39 switch(ch) 40 { 41 42 case 'l': 43 while(1) 44 { 45 ret = readdir(dp); 46 if(ret == NULL) 47 { 48 if(ret) 49 { 50 perror("readdir()"); 51 closedir(dp); 52 } 53 break; 54 } 55 if(!is_not_dir(ret->d_name)) 56 continue; 57 58 if(stat(ret->d_name, &buf)) 59 { 60 perror("stat()"); 61 closedir(dp); 62 } 63 stat_attbute(&buf); 64 printf("%s\n",ret->d_name); 65 } 66 break; 67 case 'i': 68 while(1) 69 { 70 ret = readdir(dp); 71 if(ret == NULL) 72 { 73 if(ret) 74 { 75 perror("readdir()"); 76 closedir(dp); 77 } 78 break; 79 } 80 if(!is_not_dir(ret->d_name)) 81 continue; 82 if(stat(ret->d_name, &buf)) 83 { 84 perror("stat()"); 85 closedir(dp); 86 return -1; 87 } 88 stat_ino(&buf); 89 printf("%s\n",ret->d_name); 90 } 91 break; 92 93 case 'a': 94 while(1) 95 { 96 ret = readdir(dp); 97 if(ret == NULL) 98 { 99 if(ret) 100 { 101 perror("readdir()"); 102 closedir(dp); 103 } 104 break; 105 } 106 printf("%10s ",ret->d_name); 107 } 108 break; 109 110 case 'm': 111 while(1) 112 { 113 ret = readdir(dp); 114 if(ret == NULL) 115 { 116 if(ret) 117 { 118 perror("readdir()"); 119 closedir(dp); 120 } 121 break; 122 } 123 if(!is_not_dir(ret->d_name)) 124 continue; 125 printf(" %s",ret->d_name); 126 } 127 ch = -1; 128 break; 129 130 case '?': 131 printf("没有此选项%s\n",argv[optind - 1]); 132 break; 133 default: 134 break; 135 } 136 137 } 138 139 140 141 return 0; 142 } 143 144 void stat_attbute(struct stat *buf) 145 { 146 147 stat_file(buf);//文件类型 148 stat_mode(buf);//文件权限 149 stat_link(buf);//hard link 150 stat_usr(buf);//文件用户名 151 stat_gup(buf);//文件组用户名 152 stat_byte(buf);//文件字节大小 153 stat_time(buf);//文件最后保存时间 154 155 } 156 157 int is_not_dir(char *name) 158 { 159 160 if(name[0] == '.') 161 return 0; 162 163 return 1; 164 } 165 166 myls.h文件 1 #ifndef __MYLS_H 2 #define __MYLS_H 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <fcntl.h> 6 #include <unistd.h> 7 #include <time.h> 8 #include <grp.h> 9 #include <pwd.h> 10 void stat_file(struct stat *buf);//文件类型 11 void stat_mode(struct stat *buf);//文件权限 12 void stat_link(struct stat *buf);//hard link 13 void stat_usr(struct stat *buf);//文件用户名 14 void stat_gup(struct stat *buf);//文件组用户名 15 void stat_byte(struct stat *buf);//文件字节大小 16 void stat_time(struct stat *buf);//文件最后保存时间 17 void stat_ino(struct stat *buf);//ino 18 #endif myls.c文件 1 #include <stdio.h> 2 #include "myls.h" 3 void stat_file(struct stat *buf)//文件类型 4 { 5 6 switch(buf->st_mode & S_IFMT) 7 { 8 case S_IFIFO : 9 printf("p"); 10 break; 11 12 case S_IFCHR : 13 printf("c"); 14 break; 15 16 case S_IFDIR : 17 printf("d"); 18 break; 19 20 case S_IFBLK : 21 printf("b"); 22 break; 23 case S_IFREG : 24 printf("-"); 25 break; 26 case S_IFLNK : 27 printf("l"); 28 break; 29 case S_IFSOCK : 30 printf("s"); 31 break; 32 } 33 34 35 } 36 void stat_mode(struct stat *buf)//文件权限 37 { 38 if(buf->st_mode & S_IRUSR) 39 printf("r"); 40 else 41 putchar('-'); 42 43 if(buf->st_mode & S_IWUSR) 44 printf("w"); 45 else 46 putchar('-'); 47 48 if(buf->st_mode & S_IXUSR) 49 printf("x"); 50 else 51 putchar('-'); 52 53 if(buf->st_mode & S_IRGRP) 54 printf("r"); 55 else 56 putchar('-'); 57 58 if(buf->st_mode & S_IWGRP) 59 printf("w"); 60 else 61 putchar('-'); 62 63 if(buf->st_mode & S_IXGRP) 64 printf("x"); 65 else 66 putchar('-'); 67 68 if(buf->st_mode & S_IROTH) 69 printf("r"); 70 else 71 putchar('-'); 72 73 if(buf->st_mode & S_IWOTH) 74 printf("w"); 75 else 76 putchar('-'); 77 78 if(buf->st_mode & S_IWOTH) 79 printf("x"); 80 else 81 putchar('-'); 82 putchar(' '); 83 } 84 void stat_link(struct stat *buf)//hard link 85 { 86 printf("%ld ", buf->st_nlink); 87 } 88 void stat_usr(struct stat *buf)//文件用户名 89 { 90 struct passwd *pwd = NULL; 91 92 pwd = getpwuid(buf->st_uid); 93 94 printf("%s ",pwd->pw_name); 95 96 } 97 void stat_gup(struct stat *buf)//文件组用户名 98 { 99 struct group *gnam = NULL; 100 101 gnam = getgrgid(buf->st_gid); 102 103 printf("%s ",gnam->gr_name); 104 105 } 106 void stat_byte(struct stat *buf)//文件字节大小 107 { 108 printf("%ld ",buf->st_size); 109 110 } 111 void stat_time(struct stat *buf)//文件最后保存时间 112 { 113 struct tm *times; 114 char buff[1024]; 115 116 times = localtime(&buf->st_mtim.tv_sec); 117 118 strftime(buff, 1024, "%m月 %d %H:%M", times); 119 printf("%s ",buff); 120 } 121 void stat_ino(struct stat *buf)//ino 122 { 123 printf("%ld ",buf->st_ino); 124 } ~
标签:stat,struct,void,简单,ret,myls,printf,buf,易于 来源: https://www.cnblogs.com/APUEsocket/p/10541511.html