操作系统课程设计学院:信息科学与工程学院专业:计算机科学班级:计1122班学号:20111221000学生姓名:黄小秉指导教师:蔡老师2014年3月7日一、实验内容1.题目要求题目名称:模拟文件系统[问题描述]在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的小型文件系统。[基本要求]该小型文件系统没有子目录机制,文件连续分配,不考虑分区。做一个简单的操作界面,提供四条简单的命令:简单的ls、cat、cp、rd.进一步增强:文件系统功能:文件系统不连续分配,可以有子目录机制,(如两级子目录机制)。2.指令设计:1.系统初始化指令format:将文件表中所有项删除,将物理存储块格式化2.查看系统信息ls:打印系统信息,包括系统名称,版本,设计时间,总容量和剩余容量。3.查看当前目录信息lm:打印目录下所有文件夹和文件的信息。4.查看目录下文件信息cat:打印用户指定文件和文件夹信息,需用户输入文件名5.创建目录cm:在当前目录下创建一个子目录,需要用户输入目录名6.创建文件cf:在当前目录下创建一个文件,需要用户输入文件名和文件大小7.删除目录或者文件rd:删除当前目录下用户指定的文件或者目录,需要用户输入文件名8.进入指定目录cd:进入当前目录下的一个子目录,需要用户输入子目录名9.将指定文件或目录拷贝到另一目录下cp:实现将指定的文件或者目录拷贝的功能,需要用户输入源文件的文件夹名,文件名和目标位置的文件名10.退出系统quit:退出当前系统11.清屏cls:用户认为当前屏幕内容过多可以使用该指令二、数据结构设计1.文件表文件项数据结构structFile//文件表文件项数据结构{charfile_name[50];//文件名intfile_length;//文件大小chardir_name[50];//文件所属文件名FileTypefile_type;//文件类型intfile_addr;//文件储存首地址intflag;//标志位,文件是否存在}root[16384];//定义文件表2.物理地址块数据结构structBlock//物理地址块数据结构{intisUsed;//正在使用为1,没被使用为0intflag;//标志位,-1表示文件地址连续,0~16384表示下一块地址}block[128][128];//使用位示图储存文件三、算法设计(总体设计及模块设计)1.总体设计仿照DOS界面,通过用户输入指令来执行相应的操作。2.模块设计①菜单及输入输出模块:采用while循环方式,直到用户输入quit指令终止操作退出系统,每次循环获取用户输入的指令(当然不同的指令有不同的格式,调用不同的函数),执行完成后进入下一次循环。②指令设计:format:系统初始化,与windows格式化命令相似,将所有物理块清空,初始化。ls:输出当前系统的信息,总容量,剩余容量和版权信息。lm:打印当前目录下所有文件和文件夹信息cat:查看指定文件或者文件夹的大小和信息,指令格式:cat+文件名cm:在当前目录下创建一个文件夹,指令格式:cm+文件夹名cf:在当前目录下创建一个文件,指定文件名和文件大小,指令格式:cf+文件名+文件大小rd:删除当前目录下的一个文件或者文件夹,指令格式:rd+文件夹名cd:进入当前的一个文件夹,指令格式:cd+文件夹名cp:copy指令,将指定文件路径下的文件拷贝到另一个文件目录下,指令格式:cp+源文件的路径名+源文件名+目标路径名help:帮助,显示帮助菜单quit:退出系统命令cls:清屏③创建文件算法设计:读取用户输入的文件名遍历文件表寻找当前路径下是否有重名文件,若有则创建文件失败;若无则可以创建在文件夹列表中加入一条记录,即用户输入的文件信息,创建成功。④删除文件算法设计:读取用户输入的文件名遍历文件表,查找文件是否存在,若不存在,则删除操作失败,文件存在则查看是否是一个文件目录,若是文件目录则查找文件目录下是否存在其他文件或文件夹,一并从文件列表中删除。若是普通文件,则直接删除。⑤文件拷贝操作:首先检验用户输入的源地址和目标地址是否正确,再查看文件是否存在,若校验错误,则输入错误信息,拷贝操作结束。若都校验成功,则在文件列表中添加文件信息,若是文件夹,也将目录下所有文件拷贝一份到目标地址。四、测试数据及程序运行情况1.菜单页面:2.测试数据:系统总容量:16384KB,初始化后根目录文件占用4KB,剩余16380KB,此时查看系统信息:在根目录“admin”下创建如下文件及文件夹file_Badminfile_Afile_CDoc_A200KBDoc_B321KB查看系统容量:剩余容量:16384–200–321–4*4=15847正确查看根目录下文件夹file_B的信息:输入指令:catfile_B在admin下创建文件夹一个文件夹file:输入指令cmfile再次查看目录信息:文件夹已经在列表中了在文件夹中创建一个600KB的文件doc输入指令:“cfdoc600”删除文件夹file:输入指令“rdfile”删除文件doc,输入指令:“rddoc”查看删除前容量经行删除操作:删除后查看容量:查看文件目录进入指定目录:输入指令“cdfile_B”返回上一层:输入指令“cd..”将文件夹file_B底下的doc_A拷贝到file_C下,输入指令:“cpadmin/file_BDoc_Aadmin/file_C”清屏操作:输入指令“cls”显示帮助菜单:输入指令“help”在目录file_B下创建目录file,在file下创建文件f,大小300KB将file_B下的file拷贝到file_C目录下:输入指令:“cpadmin/file_Bfileadmin/file_C”就得到文件目录file连同文件f一块复制到file_C的目录下五、实验过程中出现的问题及解决方法出现的问题:1.返回上一次目录,在文件系统中需要修改当前路径的名称:“admin/…”,无法实现,最终解决办法:用一个字符串数组储存下当前文件目录名,在返回上一层菜单时,调用文件cutString(),在cutString()中将当前文件路径名减掉当前文件目录名。2.拷贝文件操作时,将文件列表中新添加的文件的所在目录属性修改为当前目录下,解决办法:用cutStringHead()函数将复制的文件所在文件夹路径切掉当前的路径形成相对路径,再通过字符串链接将相对路径和目标路径链接形成新的文件路径名。