首页 > 代码库 > Linux基础——ls功能的简单实现
Linux基础——ls功能的简单实现
简单的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 25613 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型值。
目录的遍历实现如下:
1 int file_name(DIR *fp, char *path, char name[][CNT]) 2 { 3 int cnt = 0; 4 struct dirent *p; 5 while((p = readdir(fp)) != NULL) 6 { 7 if(strncmp(p->d_name, ".", 1) == 0 || strncmp(p->d_name, "..", 2) == 0) 8 continue; 9 strcpy(name[cnt], path);10 strcat(name[cnt], "/");11 strcat(name[cnt], p->d_name);12 cnt ++;13 }14 closedir(fp);15 return cnt;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] = ‘\0‘;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 else12 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!!\n");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\n", 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!!\n");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功能的简单实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。