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 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型值。
目录的遍历实现如下:

 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             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!!\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 }

时间: 2024-10-02 23:27:17

Linux基础——ls功能的简单实现的相关文章

Linux&amp;C编程之Linux系统命令“ls -l”的简单实现

一.基础知识: 1.获取文件详细信息的函数: (1).获取文件信息的函数: #include<sys/stat.h> int stat(const char * path,struct stat * buf);/*将path参数(文件或目录)的文件信息写到buf中,buf为传出参数*/ (2).文件信息结构体: /*用不到的成员被注释掉,只需了解需要的成员即可*/ struct stat{ //dev_t st_dev;/*设备id号*/ //ino_t st_ino;/*i节点号*/ mod

Linux下ls命令的简单实现

 #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <sys/types.h> #include <dirent.h> #include <string.h> #include <time.h> #include <pwd.h> #include <grp

Linux基础——通过select实现简单的服务器与客户端

在这里,我们还是需要一个管道,只不过,我们只需这一个管道,即可知道,客户端有哪些上线.对话.下线等. 服务器端的实现代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/stat.h> 5 #include <sys/types.h> 6 #include <fcntl.h> 7 #include <sys/t

linux基础之sudu的简单用法

su: Switch User, 以管理员身份运行某些命令: su -l root -c 'COMMAND' 但是想要限制某个用户只拥有一部分管理员权限,而不是拥有全部权限,这就需要用到sudo sudo: 是可以让某个用户不需要拥有管理员的密码,可以执行管理员的权限 作为管理员可以指派某些用户可以执行某些特定命令,类似suid 配置文件:/etc/sudoers root ALL=(ALL) ALL %wheel ALL=(ALL) ALL %wheel: 运行命令者的身份,user 第一个A

[Linux&amp;C语言] Linux系统命令“ls -l”的实现

Linux系统命令"ls -l"的实现 一.基本概念 1. "ls -l"所显示各项的意义 例:-rw-rw-r--   1  using using  3102  7月 22 17:06  test.c drwxrwxr-x  2  using using  4096  7月 22 18:39  testdir lrwxrwxrwx  1  using using      17   7月 22 18:43  shared -> /media/sf_shar

Linux基础文件管理命令之ls,cd

Linux中提供了大量的命令,使用他们可以简化我们的工作,也许在图形化界面中要点击鼠标十几下操作,而在linux系统中一条命令就可以轻松解决.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统,就必须从Linux命令学起. linux系统中的命令格式一般如下: 命令格式:   命令  选项  参数     选项:       短选项: -       多个选项可以组合:-a -b = -ab       长选项: -- 参数:命令的作用对象 下面主要介绍ls和cd命

LINUX基础命令的使用以及vim的简单命令

一 命令提示符说明 [登录用户@主机名 工作目录]# 二 Linux命令格式 命令字  [选项]  [参数1] [参数2] [ ] 表示里面内容可有可无 选项:如果是单个字符,用-               如:# ls -l 如果是一个单词,用--              如:# ls --color 多个单个字符的选项可以合并一个-   如:# ls -l -h = # ls –lh 三 基本命令及其说明 1. 基本命令 # uname -r//查询内核 # cat /etc/redha

Linux基础之如何使用帮助功能

不管是linux的初学者还是linux高手都不可避免的要查看帮助,以使得命令以不同的方式工作.linux中有成千上百条命令,每条命令又具有各种不同的参数,且由于开发者的不同每一条命令的参数又不一定代表同一个意思,靠死记硬背是不可行的,所以灵活使用linux的帮助系统可以大大提高我们的工作效率. 首先linux命令有内部命令和外部命令之分.内部命令实际上是shell程序中的一部分,其中包含的是一些比较简练的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在lin

Linux基础知识--基本概念与简单的命令

在学习linux之前,为了更好的了解linux和掌握linux个人认为应该具备以条件: 1.计算机概论和硬件的相关知识. 2.网络基础的建立. 3.从linux基础学习,例如linux的安装与命令的使用 4.linux操作系统的基础技能. 在这给出获取linux资源的网站: http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com http://mirror.bit.edu.cn/web/ 一.linux中的