1 /* 2 1.尝试实现ls命令的功能 加选项-l -a -i -h 3 */ 4 5 #include<stdio.h> 6 #include<unistd.h> 7 #include<sys/types.h> 8 #include<sys/stat.h> 9 #include<time.h> 10 #include<pwd.h> 11 #include<grp.h> 12 #include<dirent.h> 13 #include<errno.h> 14 #include<string.h> 15 #include<stdlib.h> 16 17 static long numbers; 18 //判断是否隐藏文件 19 int hidden_file(const char * p) 20 { 21 if(*p == ‘.‘) 22 return 1; 23 else 24 return 0; 25 } 26 void e_dir(char * p) 27 { 28 struct stat mystat; 29 DIR * dir; 30 struct dirent * ch; 31 int cent = stat(p,&mystat); 32 if((mystat.st_mode & S_IFMT) == S_IFDIR) 33 { 34 dir = opendir(p); 35 if(dir == NULL) 36 { 37 if(errno) 38 { 39 perror("opendir()"); 40 goto ERROR; 41 } 42 } 43 while(1) 44 { 45 ch = readdir(dir); 46 if(ch == NULL) 47 { 48 if(errno) 49 { 50 perror("readdir()"); 51 } 52 break; 53 } 54 55 l_stat(p,ch->d_name); 56 } 57 closedir(dir); 58 }else{ 59 l_stat(".",p); 60 printf("%ldk\n",numbers/2); 61 } 62 63 return ; 64 65 ERROR: 66 closedir(dir); 67 } 68 69 void h_stat(char * p) 70 { 71 struct stat mystat; 72 DIR * dir; 73 struct dirent * ch; 74 int cent = stat(p,&mystat); 75 if((mystat.st_mode & S_IFMT) == S_IFDIR) 76 { 77 dir = opendir(p); 78 if(dir == NULL) 79 { 80 if(errno) 81 { 82 perror("opendir()"); 83 goto ERROR; 84 } 85 } 86 while(1) 87 { 88 ch = readdir(dir); 89 if(NULL == ch) 90 { 91 if(errno) 92 { 93 perror("readdir()"); 94 return ; 95 } 96 break; 97 } 98 if(hidden_file(ch->d_name) == 0) 99 printf("%s \n",ch->d_name); 100 } 101 closedir(dir); 102 } 103 else 104 printf("%s \n",p); 105 106 return ; 107 108 ERROR: 109 closedir(dir); 110 } 111 112 int main(int argc,char ** argv) 113 { 114 if(argc < 3) 115 return 1; 116 char * opt = "-laih"; 117 int s; 118 while(1) 119 { 120 s = getopt(argc,argv,opt); 121 if(s == -1) 122 break; 123 switch(s) 124 { 125 case ‘l‘: e_dir(argv[2]); 126 break; 127 case ‘a‘: a_stat(argv[2]); 128 break; 129 case ‘i‘: i_stat(argv[2]); 130 break; 131 case ‘h‘: h_stat(argv[2]); 132 break; 133 case ‘?‘: printf("无该选项\n"); 134 break; 135 // case 1 : printf("%s\n",argv[2]);break; 136 default: 137 break; 138 } 139 } 140 return 0; 141 } 142 143 void i_stat(char * p) 144 { 145 struct stat mystat; 146 int nodenumber; 147 DIR * dir; 148 struct dirent * ch; 149 int cent = stat(p,&mystat); 150 151 if((mystat.st_mode & S_IFMT) == S_IFDIR) 152 { 153 dir = opendir(p); 154 if(dir == NULL) 155 { 156 if(errno) 157 { 158 perror("opendir()"); 159 goto ERROR; 160 } 161 } 162 while(1) 163 { 164 ch = readdir(dir); 165 if(NULL == ch) 166 { 167 if(errno) 168 perror("readdir()"); 169 break; 170 } 171 if(hidden_file(ch->d_name) == 0) 172 { 173 printf("%ld ",ch->d_ino); 174 printf("%s\n",ch->d_name); 175 } 176 } 177 closedir(dir); 178 }else 179 { 180 printf("%ld ",mystat.st_ino); 181 printf("%s\n",p); 182 } 183 184 return; 185 ERROR: 186 closedir(dir); 187 } 188 189 void a_stat(char * p) 190 { 191 struct stat mystat; 192 DIR * dir; 193 struct dirent * ch; 194 int cent = stat(p,&mystat); 195 196 if((mystat.st_mode & S_IFMT) == S_IFDIR) 197 { 198 dir = opendir(p); 199 if(dir == NULL) 200 { 201 if(errno) 202 { 203 perror("opendir()"); 204 goto ERROR; 205 } 206 } 207 while(1) 208 { 209 ch = readdir(dir); 210 if(NULL == ch) 211 { 212 if(errno) 213 perror("readdir()"); 214 break; 215 } 216 printf("%s ",ch->d_name); 217 } 218 }else 219 printf("%s ",p); 220 221 return ; 222 ERROR: 223 closedir(dir); 224 } 225 226 char * dir_cat(const char * p,const char * buf) 227 { 228 char * buf_cat = malloc(100); 229 230 memset(buf_cat,‘\0‘,100); 231 strcpy(buf_cat,p); 232 buf_cat[strlen(buf_cat)] = ‘/‘; 233 strcat(buf_cat,buf); 234 235 return buf_cat; 236 } 237 238 int l_stat(char * p,char * p_name) 239 { 240 struct tm * tmp = NULL; 241 struct passwd * pwd = NULL; 242 struct group * wd = NULL; 243 struct stat mystat; 244 char buf[100]; 245 char * p1; 246 int cnt; 247 248 p1 = dir_cat(p,p_name); 249 cnt = stat(p1,&mystat); 250 251 if(cnt == -1) 252 { 253 perror("stat()"); 254 return -1; 255 } 256 if(hidden_file(p_name) == 0) 257 { 258 numbers += mystat.st_blocks; 259 switch(mystat.st_mode & S_IFMT) 260 { 261 case S_IFREG: putchar(‘-‘); 262 break; 263 case S_IFBLK: putchar(‘b‘); 264 break; 265 case S_IFDIR: putchar(‘d‘); 266 break; 267 case S_IFCHR: putchar(‘c‘); 268 break; 269 case S_IFIFO: putchar(‘p‘); 270 break; 271 default:break; 272 } 273 //拥有者 274 if(mystat.st_mode & S_IRUSR) 275 putchar(‘r‘); 276 else 277 putchar(‘-‘); 278 279 if(mystat.st_mode & S_IWUSR) 280 putchar(‘w‘); 281 else 282 putchar(‘-‘); 283 284 if(mystat.st_mode & S_IXUSR) 285 putchar(‘x‘); 286 else 287 putchar(‘-‘); 288 //所属组 289 if(mystat.st_mode & S_IRGRP) 290 putchar(‘r‘); 291 else 292 putchar(‘-‘); 293 294 if(mystat.st_mode & S_IWGRP) 295 putchar(‘w‘); 296 else 297 putchar(‘-‘); 298 299 if(mystat.st_mode & S_IXGRP) 300 putchar(‘x‘); 301 else 302 putchar(‘-‘); 303 //其他 304 if(mystat.st_mode & S_IROTH) 305 putchar(‘r‘); 306 else 307 putchar(‘-‘); 308 if(mystat.st_mode & S_IWOTH) 309 putchar(‘w‘); 310 else 311 putchar(‘-‘); 312 if(mystat.st_mode & S_IXOTH) 313 putchar(‘x‘); 314 else 315 putchar(‘-‘); 316 //硬链接个数 317 printf("%2ld ",mystat.st_nlink); 318 //文件拥有者名字 319 pwd = getpwuid(mystat.st_uid); 320 printf("%s ",pwd->pw_name); 321 //文件所属组 322 wd = getgrgid(mystat.st_gid); 323 printf("%s ",wd->gr_name); 324 //总字节个数 325 printf("%5ld ",mystat.st_size); 326 //获取时间 327 tmp = localtime(&mystat.st_mtim.tv_sec); 328 strftime(buf,100,"%m月 %d %H:%M",tmp); 329 printf("%s ",buf); 330 //文件名 331 printf("%s\n",p_name); 332 } 333 return 0; 334 }
原文:https://www.cnblogs.com/shuaiGH/p/10551790.html