首页 > 其他 > 详细

尝试实现ls命令的功能 加选项-l -a -i -h

时间:2019-03-18 14:11:07      阅读:173      评论:0      收藏:0      [点我收藏+]
  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 }

 

尝试实现ls命令的功能 加选项-l -a -i -h

原文:https://www.cnblogs.com/shuaiGH/p/10551790.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!