文件树
Unix如何组织磁盘上的文件?
- 组织成一颗文件树,每个节点是目录或者文件
- 逻辑概念,通过文件树将物理上分离(多个驱动器或者分区)的文件目录无缝连接
目录
- 目录是一种特殊文件,有特殊的格式,内容是文件和目录的名字
- 不同于普通文件,目录文件永不为空: .表示当前目录 … 表示上级目录
vim ./
../
./
main.cpp
ls*
.swp
ls如何工作
- Open/read 操作目录不方便,需要了解不同类型目录(Apple HFS/ NFS/ VFAT)的结构细节
- 使用Opendir /readdir 读取目录内容
- 流程:打开目录 — 循环读取内容并展示 — 关闭目录
如何编写ls
-
版本1: 不能隐藏文件/无-l选项,无法展示文件信息
#include <dirent.h>
#include <stdio.h>
#include <sys/types.h>void do_ls(char dirname[]) {
DIR *dir_ptr;
struct dirent *direntp;
if ((dir_ptr = opendir(dirname)) == NULL) {
fprintf(stderr, “lsl: cannot open % s\n”, dirname);
} else {
while ((direntp = readdir(dir_ptr)) != NULL)
printf("%s\n", direntp->d_name);
closedir(dir_ptr);
}
}int main(int ac, char* av[]) {
if(ac==1){
do_ls(".");
}else{
while(–ac){
printf("%s \n", *(++av));
do_ls(*av);
}
}
return 0;
}
gcc main.cpp -o ls
-
对比原生ls
[root@******* ls]# ./ls …/…/
…/…/
logs
image
designP
…
.
lost+found
linux
shell
googletest
tools
[root@******** ls]# ls …/…/
designP googletest image linux logs lost+found shell tools
问题:
- 不能隐藏文件
- 无-l选项,无法展示文件信息
如何得到文件信息呢?使用stat获取文件信息
- Mode:文件类型和许可权限
- links: 文件链接数,文件被引用的次数
- Uid::用户所有者ID
- Gid:所属组的ID
- size:所占字节
- mtime:文件最后修改时间
- atime:文件最后访问时间
- ctime:文件属性最后改变时间
但是有两个展示的问题
- 模式mode字段转换为字符串
- UID/GID 都需要转换为字符串
下一节会展示版本2,实现ls -l