我在实现多级目录的时候是用递归来做的,在创建文件的时候文件名中可能包含有目录
比如创建一个文件 abc/efg ,首先从该字符串中找到第一个目录abc,剩余字符串为 efg。
首先入读根目录,从根目录的目录项中查找abc对应的头结点号。
然后根据该sector num 读取abc文件的内容,由于该文件是一个目录文件,它也保存了一个目录项,再往abc目录文件的目录项中插入该efg文件。
不过在实现的过程中有一些BUG和乱码到现在也还没解决,只好凑合凑合了。
首先文件分为目录和普通文件两类,普通文件用'-' 标示,目录文件用'd'标示
修改Directory的Add方法,利用循环遍历
bool Directory::Add(char *name, int newSector, char type,char *filepath)
{
char *p = strchr(name,'/');
if(p == NULL)
{ //如果名字中不包含目录
if (FindIndex(name) != -1)
return FALSE;
for (int i = 0; i < tableSize; i++)
if (!table[i].inUse) {
table[i].inUse = TRUE;
strncpy(table[i].name, name, FileNameMaxLen);
if(filepath!=NULL)
strncpy(table[i].path, filepath, PATH_LENGTH);
table[i].filetype = type;
table[i].sector = newSector;
return TRUE;
}
return FALSE; // no space. Fix when we have extensible files.
}else{
char path[PATH_LENGTH+1];
if(filepath!=NULL) //如果名字中包含目录
strncpy(path,filepath,PATH_LENGTH);
int index = p-name;
char dname[index+1];
strncpy(dname,name,index);
dname[index] = '\0';
//进入第一个目录
int sector = Find(dname);
if(sector ==-1) //如果找不到该目录
{
printf("couldn't find the directory %s\n",dname);
return FALSE;
}
//创建目录文件
OpenFile* openFile = new OpenFile(sector);
Directory *directory1 = new Directory(NumDirEntries);
directory1->FetchFrom(openFile);
if(!directory1->Add(p+1,newSector,type,path)) return FALSE;
directory1->WriteBack(openFile);
delete directory1;
return TRUE;
}
}
修改Find,List,Print,与Add方法类似,都是用循环递归来做。如果进入的是目录文件,则读取该目录文件,递归调用原方法。
文件系统部分,也只有多级目录这块是自己弄的,其他部分基本都是参考某学长的,估计他的报告大家应该也都是人手一份吧。
幸亏有他,不然这OS的实验都没什么思路,也不知道要费多少时间跟精力来弄。