完善了一下小bug,增加了一点新的功能
1. 支持命令及其实现细节
1.1 cd
- 相对路径
- 绝对路径
实现细节
(1) 获得cmd中的路径path
(2) 若第一个为”/”,转到绝对路径处理程序,否则转到相对路径处理程序
相对路径处理:
(1) 对path进行解析,如果含有”/”,转到(3),否则,转到(2)
(2) 若为”.”,不做操作;若为”..”,若当前目录是根目录,不做操作,否则转去父节点。都不是,去子目录下找有没有该节点并做相应跳转
(3) 若含有”/”,将”/”之间的所有字符串分离得到几个路径,然后操作同(2)
绝对路径处理:
(1) 将”/”隔开的路径分离,得到每个字符串,从根节点开始做相应跳转,并判断合法性
因此需要保存整个文件系统的根节点
1.2 pwd
显示当前的路径
实现细节
在每次创建新的文件夹时进行pwd拼接
因此每个节点的属性应有pwd
1.3 ls
ls
- 子目录
- 子文件
实现细节
遍历一遍子节点表和子文件表
ls -l(显示文件的详细信息)
- 子目录
- 子文件
- 所属用户
- 创建时间
- (文件大小)
- (当前用户对文件的权限)
实现细节
在每个节点创建时,应该包含上述属性
ls -a
显示包含隐藏的所有文件和目录(.开头的文件和目录)
Question: 对于隐藏的文件和目录,是保存在原来的表中还是单独新开一个表?
1.4 mkdir
创建一个文件夹
实现细节
创建一个新的节点,更新相应属性和指针
1.5 touch
创建一个文件
实现细节
文件也有各种属性,因此不能用字符串来简单存储,但是不需要指针,因此可以用一个节点来简单存储
1.6 rm
实现细节
(权限系统还没有加入)
我们需要对rm后的字符串进行解析,先获得”rm “后的字符串,如果为:
1. -rf dir,直接删除相应文件夹
2. dir,error:删除的是文件夹,提示使用rm-rf
3. file:从文件表中删除文件
2. 结构体设计
2.1 目录节点的设计
struct dirNode {
string name;
string owner;
dirNode* pa;
string group; //所属组
time_t time; // the time created
int size; //the size of dir
int authority[3]; //权限,三位10进制数表示
//子目录
set<dirNode> sons;
map<string, dirNode*> mm; //建立映射关系
//子文件
set<fileNode> files;
}
2.2 文件节点的设计
struct fileNode {
string name;
string owner;
string group;
time_t time;
int size;
int authority[3];
}