实现一个简单的文件系统,支持一些基本操作,目前的版本非常简陋以及鲁棒性比较差~( ̄0 ̄)/
结构
将文件系统组织成一个目录树,每个节点为目录,节点的属性包括{目录名,当前路径,父节点,子目录们,该目录下的文件}
因此,我们可以定义我们的节点属性:
struct node {
string name;
string pwd;
node *fa;
//save dirs
set<node*> sons;
//save files
set<string> files;
}
在OS中,文件是通过文件名索引的, 我们在查找目录的时候,我们是通过目录名称索引目录的,因此,还需要创建一个目录名称到目录节点的索引:
map<string, node*> basic;
操作
ls(列出该目录下的所有目录和文件)
首先,每个文件目录下,都包含“.”和“..”,分别代表当前目录和上一个目录,然后,我们只需要遍历它的子节点(目录们),该目录下的文件即可。从我们之前对目录结构的定义,可以方便的通过遍历set来遍历目录和文件
void ls() {
cout << "Directories: " << endl;
cout << "." << "\t" << ".." << "\t";
for (auto t : sons) {
if (t != fa && t != this) {
cout << t->name << "\t";
}
}
cout << endl;
cout << "Files: " << endl;
for (auto t : files) {
cout << t << "\t";
}
cout << endl;
}
cd(跳转的相应目录)
目前版本只支持相对路径的跳转,并且只能单步跳转
首先,“.”和“..”特判一下,然后,我们再去索引相应的目录。这时候,我们在结构体里面设计的basic就有用了。首先,通过basic从目录名称映射到我们的节点,然后,把当前节点的指针cur指向basic映射到的节点即可
if (cmd.substr(0, 2) == "cd") {
string t = cmd.substr(3, cmd.size() - 3);
if (t == ".") {
continue;
}
if (t == "..") {
if (cur == root) continue;
cur = cur->fa;
continue;
}
if (cur->basic.find(t) == cur->basic.end()) {
cout << "No such folder" << endl;
} else {
node *next = cur->basic[t];
cur = next;
}