本章基于目录和文件属性进行展开,最后编写ls。
1、ls命令
ls命令用于查看指定或当前目录下文件及其信息,使用情况如图所示:
写一个ls的问题:
1.如何列出目录的内容
2.如何读取并显示文件的属性
3.给出一个名字,如何判断它是目录还是文件
文件树,磁盘上的文件和目录被组成一颗目录树,每个节点都是目录或文件,如图所示:
2.ls如何工作的
工作流程大致是:
目录是一种特殊的文件,内容是文件和目录的名字,与utmp类似。是否能用什么函数读取目录里的内容呢,使用命令man -k direct | grep read
这样就能获得所有读目录的函数了。可以看到readdir就应该是我们所需要的,man 3 readdir就可以看到该函数的帮助了,其中还有个readdir(2)函数,是获取全部目录,我们只要获取目录信息就可以了,选择readdir(3)。
该函数描述中返回一个目录信息结构体指针。同样在man -k direct中还有打开opendir,关闭closedir函数.
跟着文中进行编写,编写出个基本的就是单纯能够展示本地文件名称.最初效果如图所示:
这时候并不能过滤.和..,同时书中希望的效果与ls -l命令相类似,如图所示:
在ls -l中前面的是文件类型和权限,而这个信息是保存在stat结构体的st_mode中,该参数是16bit,最高的4字节是文件类型,接下来3bit是文件的特殊属性,最后9bit是3种用户的权限,分别为文件所有者、同组用户和其他用户。每组3bit分别是读、写和执行的权限,结构如图所示:
在sys/stat.h头文件中都会有相应的宏对这些位进行判断,ubuntu中头文件位置已经改变,通过find命令查找相关头文件,find /usr/include -name stat.h这样在/usr/include中进行搜索如图所示:
图中第一个文件应该是我们需要的,使用more命令查看其头文件内容
这些在之后编程判断其类型权限时都是需要用到的。如图所示是转换函数:
接着还有文件用户名、用户组的名称转换,如图所示是相关头文件
最后我解决了大部分的问题,代码在gitee中,结果没有排序和数量,这个弄个数组排序就可以了,这边我就没弄,结果如图所示:
ls -l /tmp对比:
之后可能会在课后练习中将其完善。