nachos文件系统-实现多级目录

我在实现多级目录的时候是用递归来做的,在创建文件的时候文件名中可能包含有目录

比如创建一个文件 abc/efg ,首先从该字符串中找到第一个目录abc,剩余字符串为 efg。

首先入读根目录,从根目录的目录项中查找abc对应的头结点号。

然后根据该sector num 读取abc文件的内容,由于该文件是一个目录文件,它也保存了一个目录项,再往abc目录文件的目录项中插入该efg文件。


不过在实现的过程中有一些BUG和乱码到现在也还没解决,只好凑合凑合了。

首先文件分为目录和普通文件两类,普通文件用'-' 标示,目录文件用'd'标示


修改DirectoryAdd方法,利用循环遍历

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的实验都没什么思路,也不知道要费多少时间跟精力来弄。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 概述 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。 本次实验我们实现多级目录下的文件管理系统,具备文件系统的文件创建、删除、读写以及目录的创建、删除等操作,并在内存中开辟一块空间,模拟虚拟磁盘,成功地展示出文件系统的功能和属性。 2 课程设计的任务和要求 2.1 设计任务 在下列内容中任选其一: 1、多用户、多级目录结构文件系统设计实现; 2、WDM驱动程序开发; 3、存储管理系统的实现,主要包括虚拟存储管理调页、缺页统计等; 4、进程管理系统的实现,包括进程的创建、调度、通信、撤消等功能; 5、自选一个感兴趣的与操作系统有关的问题加以实现,要求难度相当。 2.2 设计要求 1、在深入理解操作系统基本原理的基础上,对于选定的题目,以小组为单位,先确定设计方案; 2、设计系统的数据结构和程序结构,设计每个模块的处理流程。要求设计合理; 3、编程序实现系统,要求实现可视化的运行界面,界面应清楚地反映出系统的运行结果; 4、确定测试方案,选择测试用例,对系统进行测试; 5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并回答指导教师的提问; 6、提交课程设计报告。 集体要求: 1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录文件系统。 2.文件物理结构可采用显式链接或其他方法。 3.磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。 4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录实现对文件的读和写的保护。目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。 5.设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作: (1)具有login (用户登录) (2)系统初始化(建文件卷、提供登录模块) (3)文件的创建: create (4)文件的打开:open (5)文件的读:read (6)文件的写:write (7)文件关闭:close (8)删除文件:delete (9)创建目录(建立子目录):mkdir (10)改变当前目录:cd (11)列出文件目录:dir (12)退出:logout ................................................

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值