Linux基础?ls功能的简单实现

Sally ·
更新时间:2024-11-10
· 697 次阅读

  简单的ls实现,首先,我们需要遍历参数目录下的各个文件,再根据文件相应的性质,读取文件的权限,用户组,用户名,大小,后一次访问的时间,再根据文件名排序后依次显示。   具体的函数声明如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/stat.h> 5 #include <fcntl.h> 6 #include <unistd.h> 7 #include <dirent.h> 8 #include <sys/types.h> 9 #include <pwd.h> 10 #include <grp.h> 11 #include <time.h> 12 #define CNT 256 13 int file_name(DIR *fp, char *path, char name[][CNT]); 14 void str_sort(char name[][CNT], int cnt); 15 void mode_to_char(mode_t mode, char *buf); 16 char *time_change(char *time); 17 void show(char name[][CNT], int cnt);   目录的遍历,我们需要知道目录下读取到的文件个数,所以需要返回相应的int型值。   目录的遍历实现如下: 1intfile_name(DIR*fp,char*path,charname[][CNT]) 2{ 3intcnt=0; 4structdirent*p; 5while((p=readdir(fp))!=NULL) 6{ 7if(strncmp(p->d_name,".",1)==0||strncmp(p->d_name,"..",2)==0) 8continue; 9strcpy(name[cnt],path); 10strcat(name[cnt],"/"); 11strcat(name[cnt],p->d_name); 12cnt++; 13} 14closedir(fp); 15returncnt; 16}   然后我们需要了解文件的权限,文件权限保存在相对应的参数char *buf中。文件权限的解读实现如下: 1 void mode_to_char (mode_t mode, char *buf) 2 { 3     memset(buf, '-', 10); 4     if(S_ISDIR(mode)) 5         buf[0] = 'd'; 6     if(mode & S_IRUSR) 7         buf[1] = 'r'; 8     if(mode & S_IWUSR) 9         buf[2] = 'w'; 10     if(mode & S_IXUSR) 11         buf[3] = 'x'; 12     if(mode & S_IRGRP) 13         buf[4] = 'r'; 14     if(mode & S_IWGRP) 15         buf[5] = 'w'; 16     if(mode & S_IXGRP) 17         buf[6] = 'x'; 18     if(mode & S_IROTH) 19         buf[7] = 'r'; 20     if(mode & S_IWOTH) 21         buf[8] = 'w'; 22     if(mode & S_IXOTH) 23         buf[9] = 'x'; 24 }   想应的,时间的显示不需要那么精确,所以我们应适当的缩短时间精确度。   时间的显示实现如下:   1 char *time_change(char *time)   2 {   3     int index = strlen(time) - 1;   4     for(; time[index] != ':'; index --);   5     time[index] = '';   6     return time + 4;   7 }   然后,我们需要根据文件名称按照字典序排序。   排序的实现如下: 1 void str_sort(char name[][CNT], int cnt) 2 { 3     int index, pos; 4     char str[CNT]; 5     for(pos = 1; pos < cnt; pos ++) 6     { 7         strcpy(str, name[pos]); 8         for(index = pos - 1; index >= 0; index --) 9             if(strcmp(name[index], str) > 0) 10                 strcpy(name[index + 1], name[index]); 11             else 12                 break; 13         strcpy(name[index + 1], str); 14     } 15 }后,我们在编写一个简单的show()函数,来显示各个文件的信息。   show函数实现如下: 1 void show(char name[][CNT], int cnt) 2 { 3     int index; 4     char mode[10]; 5     char *str; 6     struct stat buf; 7     for(index = 0; index < cnt; index ++) 8     { 9         memset(&buf, 0, sizeof(buf)); 10         if(stat(name[index], &buf) == -1) 11         { 12             printf("stat error!! "); 13             exit(1); 14         } 15         mode_to_char(buf.st_mode, mode); 16         str = ctime(&buf.st_atime); 17         str = time_change(str); 18         int i; 19         for(i = strlen(name[index]) - 1; name[index][i] != '/'; i --); 20         i++; 21         printf("%10s.%2d %5s %5s%5d%13s %s ", mode, buf.st_nlink, getpwuid(buf.st_uid)->pw_name, getgrgid(buf.st_gid)->gr_name, buf.st_size, str, name[index] + i); 22     } 23 }   这里需要注意:   getpwuid()返回的不是我们要的用户名,我们需要的是该结构体中的一个变量——pw_name,同样的getgrid()也应做相应的转换。   测试代码如下: 1 #include "head.h" 2 int main(int argc, char *argv[]) 3 { 4     DIR *fp; 5     char name[CNT][CNT]; 6     int cnt; 7     fp = opendir(argv[1]); 8     if(fp == NULL) 9     { 10         printf("opendir error!! "); 11         exit(1); 12     } 13     cnt = file_name(fp, argv[1], name); 14     str_sort(name, cnt); 15     show(name, cnt); 16     return 0; 17 }



linux基础 ls Linux

需要 登录 后方可回复, 如果你还没有账号请 注册新账号