myls

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <sys/types.h>
  4 #include <sys/stat.h>
  5 #include <unistd.h>
  6 #include <pwd.h>
  7 #include <grp.h>
  8 #include <time.h>
  9 #include <dirent.h>
 10 #include <errno.h>
 11 
 12 #define BUFSIZE 1024
 13 
 14 static void l(char *p);
 15 static void a(char *p);
 16 static void i(char *p);
 17 static void h(char *p);
 18 static void mulu(char *p);
 19 static void quanxian(struct stat mystat);
 20 
 21 
 22 
 23 //是目录
 24 static void mulu(char *p)
 25 {
 26     struct dirent *read = NULL;
 27     DIR *dir = NULL;
 28     struct stat mystat;
 29     char buf[BUFSIZE] = {};
 30 
 31     dir = opendir(p);
 32     if (p == NULL) {
 33         perror("opendir()...");
 34         return;
 35     }
 36 
 37     while (1) {
 38         read = readdir(dir);
 39         if (NULL == read) {
 40             if (errno) {
 41                 perror("readdir()...");
 42                 closedir(dir);
 43                 return;
 44             }
 45             break;
 46         }
 47             memset(buf, '\0', BUFSIZE);
 48             strcpy(buf, p);
 49             strcat(buf, "/");
 50             strcat(buf, read->d_name);
 51             
 52         if (stat(buf, &mystat) == -1) {
 53             perror("stat()");
 54             return ;
 55         }        
 56         switch (mystat.st_mode & S_IFMT) {
 57             case S_IFREG:
 58                 putchar('-');
 59                 break;
 60             case S_IFSOCK:
 61                 putchar('s');
 62                 break;
 63             case S_IFLNK:
 64                 putchar('l');
 65                 break;
 66             case S_IFBLK:
 67                 putchar('b');
 68                 break;
 69             case S_IFDIR:
 70                 putchar('d');
 71                 break;
 72             case S_IFCHR:
 73                 putchar('c');
 74                 break;
 75             case S_IFIFO:
 76                 putchar('p');
 77                 break;
 78             default:
 79                 break;
 80         }
 81         quanxian(mystat);
 82         printf("%s", read->d_name);
 83         putchar('\n');
 84     }
 85     closedir(dir);
 86     return;
 87 }
 88 //是文件
 89 
 90 //读信息
 91 static void quanxian(struct stat mystat)
 92 
 93 {
 94     //*****************可读可写可执行
 95     if (mystat.st_mode & S_IRUSR)
 96         putchar('r');
 97     else
 98         putchar('-');
 99     if (mystat.st_mode & S_IWUSR)
100         putchar('w');
101     else
102         putchar('-');
103     if (mystat.st_mode & S_IXUSR)
104         putchar('x');
105     else
106         putchar('-');
107     if (mystat.st_mode & S_IRGRP)
108         putchar('r');
109     else
110         putchar('-');
111     if (mystat.st_mode & S_IWGRP)
112         putchar('w');
113     else
114         putchar('-');
115     if (mystat.st_mode & S_IXGRP)
116         putchar('x');
117     else
118         putchar('-');
119     if (mystat.st_mode & S_IROTH)
120         putchar('r');
121     else
122         putchar('-');
123     if (mystat.st_mode & S_IWOTH)
124         putchar('w');
125     else
126         putchar('-');
127     if (mystat.st_mode & S_IXOTH)
128         putchar('x');
129     else
130         putchar('-');    
131 //*******************其他信息
132     printf(" %ld ", mystat.st_nlink);
133 
134     struct passwd *pwd = NULL;//man 3 getgrpid
135     pwd = getpwuid(mystat.st_uid);
136     printf("%s ",pwd->pw_name);
137 
138     struct group *grp = NULL;//man 3 getgegid
139     grp = getgrgid(mystat.st_gid);
140     printf("%s ", grp->gr_name);
141 
142     printf("%ld ", mystat.st_size);
143 
144     struct tm *t = NULL;
145     t = localtime(&mystat.st_mtim.tv_sec);
146     //if error
147     char buf[1024] = {};
148     strftime(buf, 1024, "%m月  %d %H:%M", t);
149     printf("%s ",buf);
150 }
151 
152 static void l(char *p)
153 {
154     struct stat mystat;
155     if (stat(p, &mystat) == -1) {
156         perror("stat()");
157         return;
158     }
159     switch (mystat.st_mode & S_IFMT) {
160         case S_IFDIR:
161             mulu(p);
162             break;
163         case S_IFREG: case S_IFSOCK: case S_IFLNK: 
164         case S_IFBLK: case S_IFCHR: case S_IFIFO:
165             quanxian(mystat);
166             printf("%s \n", p);
167             break;
168         default:
169             break;
170     }
171 
172 }
173 
174 static void a(char *p)
175 {
176     struct dirent *read = NULL;
177     DIR *dir = NULL;
178     int i = 0;
179 
180     dir = opendir(p);
181     if (p == NULL) {
182         perror("opendir()...");
183         return;
184     }
185 
186     while (1) {
187         read = readdir(dir);
188         if (NULL == read) {
189             if (errno) {
190                 perror("readdir()...");
191                 closedir(dir);
192                 return;
193             }
194             break;
195         }
196             printf("%s        ", read->d_name);
197             i++;
198             if (!(i % 5))
199                 printf("\n");
200     }
201     printf("\n");
202     closedir(dir);
203     return;
204 }
205 
206 static void i(char *p)
207 {
208     struct dirent *read = NULL;
209     DIR *dir = NULL;
210     struct stat mystat;
211     char buf[BUFSIZE] = {};
212 
213     dir = opendir(p);
214     if (p == NULL) {
215         perror("opendir()...");
216         return;
217     }
218 
219     while (1) {
220         read = readdir(dir);
221         if (NULL == read) {
222             if (errno) {
223                 perror("readdir()...");
224                 closedir(dir);
225                 return;
226             }
227             break;
228         }
229             memset(buf, '\0', BUFSIZE);
230             strcpy(buf, p);
231             strcat(buf, "/");
232             strcat(buf, read->d_name);
233         if (stat(buf, &mystat) == -1) {
234             perror("stat()");
235             return ;
236         }        
237         printf("%ld    %s\n",mystat.st_ino, read->d_name);
238     }
239     closedir(dir);
240     return;
241 }
242 
243 static void h(char *p)
244 {
245     struct dirent *read = NULL;
246     DIR *dir = NULL;
247     int i = 0;
248 
249     dir = opendir(p);
250     if (p == NULL) {
251         perror("opendir()...");
252         return;
253     }
254 
255     while (1) {
256         read = readdir(dir);
257         if (NULL == read) {
258             if (errno) {
259                 perror("readdir()...");
260                 closedir(dir);
261                 return;
262             }
263             break;
264         }
265         if (!strcmp(read->d_name, ".") || !strcmp(read->d_name, ".."))
266             continue;
267             printf("%s        ", read->d_name);
268             i++;
269             if (!(i % 5))
270                 printf("\n");
271     }
272     printf("\n");
273     closedir(dir);
274     return;
275 }
276 int main(int argc, char *argv[])
277 {
278     char *optstring    = "-l::a:h:i:"; 
279     int c;
280     while (1) {
281         c = getopt(argc, argv, optstring);
282         if (c == -1)
283             break;
284         switch (c) {
285             case 'l':    //显示目录和文件信息
286                 l(argv[2]);
287                 break;
288                 case 'a':    //显示文件名包括隐藏文件
289                 a(argv[2]);
290                 break;
291                 case 'h':    //显示文件名,不含隐藏文件
292                 h(argv[2]);
293                 break;
294                 case 'i':    //显示文件inode和文件名
295                 i(argv[2]);
296                 break;
297         }
298     }
299 
300     return 0;
301 }

猜你喜欢

转载自www.cnblogs.com/frank-zhao19/p/10536685.html
MYS