代码部分
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函数后会在系统调用的时切换到需要访问的目录下所有就不会报错了。