1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <sys/stat.h>
6 #include <dirent.h>
7 #include <pwd.h>
8 #include <utime.h>
9 #include <time.h>
10 #include <grp.h>
11
12 #ifndef FILE_MAX
13 #define FILE_MAX 1024
14 #endif
15
16 char fileName[FILE_MAX][FILENAME_MAX];
17
18 int rwxMode[] = {0,S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH};
19
20 char getFileType(mode_t mode){
21 if(S_ISDIR(mode)) return 'd';
22 else if(S_ISCHR(mode)) return 'c';
23 else if(S_ISBLK(mode)) return 'b';
24 else if(S_ISFIFO(mode)) return 'f';
25 else if(S_ISLNK(mode)) return 'l';
26 else if(S_ISSOCK(mode)) return 's';
27 else return '-';
28 }
29
30 void sort(char array[][FILENAME_MAX], int n){
31 int i,j;
32 char temp[FILENAME_MAX];
33 for(i = n-1; i >= 0; --i)
34 for(j = 0; j < i; ++j)
35 if(strcmp(array[j], array[j+1]) > 0){
36 strcpy(temp, array[j]);
37 strcpy(array[j], array[j+1]);
38 strcpy(array[j+1], temp);
39 }
40 }
41
42 int main(int argc, char *argv[]){
43 char *dirPath;
44 if(argc >= 2) dirPath = argv[1];
45 else{
46 dirPath = malloc(FILENAME_MAX);
47 if(getcwd(dirPath, FILENAME_MAX) == NULL){
48 perror("getcwd returns error");
49 exit(EXIT_FAILURE);
50 }
51 }
52
53 DIR * dirp = opendir(dirPath);
54 if(dirp == NULL){
55 perror("opendir returns error");
56 exit(EXIT_FAILURE);
57 }
58 int filen = 0, i, j;
59 while(1){
60 struct dirent * fileInfo = readdir(dirp);
61 if(fileInfo == NULL) break;
62 strcpy(fileName[filen++], fileInfo->d_name);
63 }
64 sort(fileName, filen);
65 for(i = 0; i < filen; ++i){
66 struct passwd * userInfo;
67 struct group * groupInfo;
68 struct stat fileStat;
69 struct tm *mTime;
70 char fileMode[11], filePath[FILENAME_MAX];
71 if(dirPath[strlen(dirPath)-1] != '/')
72 sprintf(filePath,"%s/%s",dirPath, fileName[i]);
73 else sprintf(filePath, "%s%s",dirPath, fileName[i]);
74 if(stat(filePath, &fileStat) < 0){
75 perror("stat returns error");
76 exit(EXIT_FAILURE);
77 }
78 strcpy(fileMode, "-rwxrwxrwx");
79 fileMode[0] = getFileType(fileStat.st_mode);
80 for(j = 1; j < 10; ++j)
81 if(!(fileStat.st_mode & rwxMode[j])) fileMode[j] = '-';
82
83 userInfo = getpwuid(fileStat.st_uid);
84 groupInfo = getgrgid(fileStat.st_gid);
85 if(userInfo == NULL || groupInfo == NULL){
86 perror("getpwuid returns error");
87 exit(EXIT_FAILURE);
88 }
89 mTime = localtime(&fileStat.st_mtime);
90 printf("%s %2d %8s %8s %5d %2d月 %2d %02d:%02d %s\n",fileMode,fileStat.st_nlink,userInfo->pw_name, groupInfo->gr_name,(int)fileStat.st_size,mTime->tm_mon+1, mTime->tm_mday, mTime->tm_hour, mTime->tm_min, fileName[i]);
91 }
92 if(argc < 2) free(dirPath);
93 return 0;
94 }