zoukankan      html  css  js  c++  java
  • 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);
    View Code

    目录的遍历,我们需要知道目录下读取到的文件个数,所以需要返回相应的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 }
    View Code

    然后我们需要了解文件的权限,文件权限保存在相对应的参数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 }
    View Code

    想应的,时间的显示不需要那么精确,所以我们应适当的缩短时间精确度。
    时间的显示实现如下:

    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 }
    View Code

    然后,我们需要根据文件名称按照字典序排序。
    排序的实现如下:

     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 }
    View Code

    最后,我们在编写一个简单的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 }
    View Code

    这里需要注意:

      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 }
    View Code
  • 相关阅读:
    Mongodb 的ORM框架 Morphia之注解
    Redis主从集群及哨兵模式
    Dubbo
    Zookeeper
    使用Dockerfile自定义一个包含centos,tomcat的镜像
    linux/centOS 下安装 ngnix
    Session共享
    Linux安装jdk.18和tomcat8
    MongoDB集群的搭建
    多态--方法重写的三个要点
  • 原文地址:https://www.cnblogs.com/gjn135120/p/4009268.html
Copyright © 2011-2022 走看看