文件操作 ls代码实现总结(-l, -a, -r选项)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42250655/article/details/81211751

代码部分

  1 #include<stdio.h>                                                                                                                                    
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<time.h>
  6 #include<sys/stat.h>
  7 #include<unistd.h>
  8 #include<dirent.h>
  9 #include<grp.h>
 10 #include<pwd.h>
 11 #include<errno.h>
 12  
 13 /*
 14 -a flag = 1;
 15 -l flag = 2;
 16 -la flag = 3;
 17 -R flag = 4;
 18 -aR flag = 5;
 19 -lR flag = 6;
 20 -laR flag = 7;
 21 */
 22  
 23 void print(char *name);
 24 void erro(char *str, int line);
 25 int my_readir(char * path, int flag);
 26  
 27 void erro(char *str, int line)                     //错误处理函数
 28 {
 29     fprintf(stderr, "line: %d", line);
 30     perror(str);
 31     exit(0);
 32 }
 33  
 34 int my_readir(char * path, int flag)
 35 {
 36     int i, j;
 37     int count = 0;
 38     DIR * dir;
 39     struct dirent * ptr;
 40     char name[50][50] = {0};
 41     struct stat buf;                 
 42     if(stat(path, &buf) == -1)
 43         erro("stat", __LINE__);
 44     if(S_ISDIR(buf.st_mode))
 45     {   
 46         if(chdir(path) == -1)
 47             erro("chdir", __LINE__);
 48         if((dir = opendir(path)) == NULL)
 49         {
 50             perror("opendir");
 51             return -1;
 52         }
 53         while((ptr = readdir(dir)) != NULL)
 54         {
 55             strcpy(name[count], ptr->d_name);
 56             count++;
 57             //print(ptr->d_name);
 58         }
 59         int array[count], temp;
 60         for(i = 0; i < count; i++)
 61         array[i] = i;
 62         /*对文件进行排序*/
 63         for(i = 0; i < count - 1; i++)
 64         {
 65             for(j = 0; j < count - i - 1; j++)
 66             {
 67                 if(strcmp(name[array[j]], name[array[j + 1]]) > 0)
 68                 {
 69                     temp = array[j];
 70                     array[j] = array[j + 1];
 71                     array[j + 1] = temp;
 72                 }
 73             } 
 74			 }
 75         switch(flag)
 76         {
 77             case 0:
 78                 for(i = 0, j = 0; i < count; i++)
 79                 {
 80                     if(name[array[i]][0] == '.')
 81                         continue;
 82                     //if(stat(name[array[i]], &buf) == -1)
 83                     //  erro("stat", __LINE__);
 84                     //if(S_ISDIR(buf.st_mode))
 85                     //  printf("%s", 
 86                     printf("%s\t", name[array[i]]);
 87                     j++;
 88                     if((j + 1) % 5 == 0)
 89                         printf("\n");
 90                 }
 91                 printf("\n");
 92                 break;
 93             case 1:
 94                 for(i = 0; i < count; i++)
 95                 {
 96                     printf("%s\t", name[array[i]]);
 97                     if((i + 1) % 5 == 0)
 98                         printf("\n");
 99                 }
100                 printf("\n");
101                 break;
102             case 2:
103                 for(i = 0; i < count; i++)
104                 {
105                     if(name[array[i]][0] == '.')
106                         continue;
107                     print(name[array[i]]);
108                 }
109                     break;
110             case 3:
111                 for(i = 0; i < count; i++)
112                     print(name[array[i]]);
113                     break;
114         }
115     }
116     else
117     {
118         print(path);
119     }
120     closedir(dir);
121     return 0;
122 }  
123 void print(char * name)
124 {       
125         int mode;
126         char buf_time[32];
127     struct stat buf;
128         struct group *grp;      //获取文件所属用户组名
129         struct passwd *pwd;     //获取文件所属用户名
130         if(lstat(name, &buf) == -1)
131         erro("stat", __LINE__);
132         mode = buf.st_mode;
133         
134         /*获取文件权限*/
135         if(S_ISLNK(mode))
136                 printf("l");
137         else if(S_ISREG(mode))
138                 printf("-");
139         else if(S_ISDIR(mode))
140                 printf("d");
141         else if(S_ISCHR(mode))
142                 printf("c");
143         else if(S_ISBLK(mode))
144                 printf("b");
145         else if(S_ISFIFO(mode))  
146                 printf("f");
147         else if(S_ISSOCK(mode))
148                 printf("s");            
149         /*获取并打印文件所有者的权限*/
150         if(mode & S_IRUSR)
151                 printf("r");
152         else             
153                 printf("-");
154         if(mode & S_IWUSR)
155                 printf("w");
156         else             
157                 printf("-");
158         if(mode & S_IXUSR)
159                 printf("x");
160         else             
161                 printf("-");
162          /*获取并打印文件所属组的权限*/
163         if(mode & S_IRGRP)
164                 printf("r");
165         else             
166                 printf("-");
167         if(mode & S_IWGRP)
168                 printf("w");
169         else             
170                 printf("-");
171         if(mode & S_IXGRP)
172                 printf("x");
173         else             
174                 printf("-");
175         
176         
177         /*获取并打印文件其他用户的权限*/
178         if(mode & S_IROTH)                                                                                                                                   
179                 printf("r");
180         else 
181                 printf("-");
182         if(mode & S_IWOTH)
183                 printf("w");
184         else             
185                 printf("-");
186         if(mode & S_IXOTH)
187                 printf("x");
188         else             
189                 printf("-");
190                          
191        
192         printf(" %ld", buf.st_nlink);    //打印文件链接数
193         pwd = getpwuid(buf.st_uid);
194         grp = getgrgid(buf.st_gid);
195         printf(" %s", pwd->pw_name);
196         printf(" %s", grp->gr_name);
197        
198         printf(" %ld", buf.st_size);  //打印文件大小
199         strcpy(buf_time, ctime(&buf.st_mtime));      //取出文件的时间
200         buf_time[strlen(buf_time) - 1]  = '\0';     //去掉换行符
201         printf(" %s", buf_time);   //打印文件时间信息
202     printf(" %s\n", name);     //打印文件名字
203 }   
204     
205     
206 int main(int argc, char * argv[])
207 {   
208     int flag = 0;
209     int i, j;
210     int len;
211     char pathname[50] = {0};
212     char path[50] = {0};
213     for(i = 0; i < argc; i++)
214     {
215         if(argv[i][0] == '-')
216         { 
217             len = strlen(argv[i]);
218             for(j = 1; j < len; j++)
219             {
220                 if(argv[i][j] == 'a')
221                 {
222                     flag += 1;
223                     continue;
224                 }
225                 if(argv[i][j] == 'l')
226                 {
227                     flag += 2;
228                     continue;
229                 }
230                 if(argv[i][j] == 'R')
231                 {
232                     flag += 4;
233                     continue;
234                 }
235             }
236         }
237     }
238     printf("flag = %d\n", flag);
239     if(argc < 2)
240         erro("输入错误", __LINE__);
241     else if(argc == 2)
242     {
243         if(getcwd(pathname, 50) == NULL)
244             erro("getcwd", __LINE__);
245         my_readir(pathname, flag);
246     }
247     else if(argc == 3)
248     {
249         if(flag == 0)
250         {
251             strcpy(pathname, argv[2]);
252             my_readir(pathname, flag);
253         }
254         else
255         {
256             if(getcwd(pathname, 50) == NULL)
257                 erro("getcwd", __LINE__);
258             my_readir(pathname, flag);
259         }
260     }
261     else
262     {
263         if(flag == 0)
264             erro("flag", __LINE__);
265         else

266         {
267             strcpy(pathname, argv[argc - 1]);
268             my_readir(pathname, flag);
269         }
270     }
271    
272     
273    
274     return 0;
275 }                                                                                                                                                                                                                                                                   
  • 在实现的时候问题出现在第46行,当时是没有加入 int chdir(const char * path)这个函数的,所以在ls其他目录时会报错。
    错误报告 stat: no such file or directory.
    加入chdir函数后会在系统调用的时切换到需要访问的目录下所有就不会报错了。
展开阅读全文

没有更多推荐了,返回首页