Linux命令:ls的实现

单个执行不带参数的ls命令时,会显示当前目录下的文件名

这里我们用到了两个函数opendir和readdir。这两个函数存在于<dirent.h>头文件中用法如下:

还有一个dirent类型的结构体,这里面有两个变量

先使用opendir函数打开一个目录并建立一个目录流,然后再调用readdir函数获取该目录中一个目录项的资料(inode结点号和文件名)。

具体实现如下

上面这些是ls命令所在文件的主函数,下面介绍一下实现的参数。

实现参数:

       ls -a

       ls -l

ls -i

在ls.c文件中,我们除了有main函数外,还有其他一系列为main函数做辅助的函数

用于分析参数的AnalPara函数

在该函数中,我们使用到了一个全局变量flag,它的作用是用来标记所出现的参数,

如果argv[i]中第一个字符不是‘-’,那么我们就把他当成路径处理,再判断所给路径是直接路径还是间接路径,若是直接路径(首字符为‘/’),则直接copy到path字符数组中,若是间接路径,就表示当前目录下的某个子目录,那么我们将当前路径和所给间接路径连接起来作为最终路径,copy到path中,传回主函数。

如果argv[i]中第一个字符是‘-’,那么我们把他当作参数处理,因为只实现了三个参数,所以我们把可识别的参数的范围确定在a,l,i三个字符之间。为a时,flag所在内存中第一个位置为1,为l时,第二位置为1,为i时,第三位置为1.其他字符flag则每位都是0.将这些信息传回主函数,以便于进一步进行处理。

用于输出文件名的PrintFileName函数

在Linux系统中,每种不同类型的文件,不同权限的文件,都会有不同的颜色来表示,因此我们在这个函数中对文件的类型和权限都做了判断,再利用printf函数将要输出的文件名设置成相应的颜色。下面是不同代码表示的颜色

字背景颜色范围: 40--49                   字颜色: 30--39
                40:
                           30:
                41:                            31:
                42: 绿                           32: 绿
                43:                            33:
                44:                            34:
                45:                            35:
                46: 深绿                         36: 深绿
                47: 白色                         37: 白色


ANSI控制码:
QUOTE:
  \033[0m  
关闭所有属性  
  \033[1m  
设置高亮度  
  \03[4m  
下划线  
  \033[5m  
闪烁  
  \033[7m  
反显  
  \033[8m  
消隐  
  \033[30m   --   \033[37m  
设置前景色  
  \033[40m   --   \033[47m  
设置背景色  
  \033[nA  
光标上移n  
  \03[nB  
光标下移n  
  \033[nC  
光标右移n  
  \033[nD  
光标左移n  
  \033[y;xH
设置光标位置  
  \033[2J  
清屏  
  \033[K  
清除从光标到行尾的内容  
  \033[s  
保存光标位置  
  \033[u  
恢复光标位置  
  \033[?25l  
隐藏光标  
  \33[?25h  
显示光标

 

用于输出文件详细信息的PrintMoreInfo函数

要想实现-l命令,首先要知道系统的-l参数输出的每一个信息分别代表什么意思。

单独存在的一个total 72表示该目录下面所有文件大小共72k

下面每一行代表的含义都是相同的,

第一字段表示权限第一位的-表示不同的文件类型(普通文件,管道文件)。后面九位分别表示,该文件的属主,组用户和其他用户的读,写,执行三种不同的权限。

第二字段表示该文件的硬链接个数。

如果是一个目录,则第2字段表示该目录所含子目录的个数。

新建一个空目录,这个目录的第二字段就是2,表示该目录下有两个子目录。为什么新建的目录下面会有两个子目录呢?

因为每一个目录都有一个指向它本身的子目录"。" 和指向它上级目录的子目录"。。",这两个默认子目录是隐藏的。ls -a可以看到

每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加。

第三字段表示该文件的属主用户

第四字段表示该文件的组用户

第五字段表示文件所占用的大小,以字节为单位,如果是目录文件,则表示该目录的大小,而不是该目录下所有文件的大小

第六字段表示最后修改的时间

第七字段很明显是文件名

下面是该函数的具体实现

猜你喜欢

转载自blog.csdn.net/Mr_H9527/article/details/83509118
今日推荐