操作系统原理课程设计报告题目:采用二级目录实现文件管理所在学院:班级:学号:姓名:指导教师:2013年1月15日目录一、课程设计目的………………………………………………1二、课题内容………………………………………………1三、总体路线………………………………………………1四、概要设计………………………………………………21.数据结构………………………………………………22.所使用函数及其功能……………………………………3五、详细设计………………………………………………41.主函数流程图…………………………………………42.创建文件函数流程图……………………………………53.删除文件函数流程图……………………………………74.分解命令函数流程图……………………………………10六、测试、修改及运行结果………………………………10七、结束语………………………………………………13八、参考文献………………………………………………14os.采用二级目录实现文件管理1一、课程设计目的文件系统是现代OS用来存储和管理信息机构,具有按名存取的功能,不仅能方便用户对信息的使用,也有效提高了信息的安全性。本课题模拟文件系统的目录结构,并在此基础上实现文件的各种操作方法。通过本课题,深入理解文件文件目录的作用和功能,掌握文件打开结构,熟悉与文件有关的系统调用,从而更好地掌握文件系统概念。二、课题内容1.文件目录采用二级目录结构,第一级为主文件目录master_file_directory;第二级为用户文件目录user_file_directory。用户名用户文件目录地址图1master_file_directory结构文件名文件保护方式文件设置长度文件所在地址图2user_file_directory结构2.为加速文件存取,为每个用户建立一张用户打开表fileTable,用以记录该用户当前正在使用的文件。文件名文件长度文件所在地址文件类型创建文件时间图3fileTable结构3.为该系统提供6条操作命令:创建、打开、读、写、关闭、删除等。4.在该模拟系统中,应先建立主文件目录、用户目录和用户打开文件表,然后接受合法用户,给出一个菜单,按用户选择执行相关操作。三、总体路线1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。在退出这个简单的文件系统时,应将该虚拟文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。2.文件存储空间的分配采用显式链接分配。为了实现创建和删除文件必os.采用二级目录实现文件管理2须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件。3.文件目录结构采用二级目录结构。为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指4.要有分解函数对输入的命令进行分解。以识别那部分是哪部分是命令,哪部分是路径和文件名。5.最后要有执行函数。来执行输入的创建文件命令。四、概要设计1.数据结构(1)函数中的主要结构体//两级目录结构体typedefstructmaster_file_directory//主文件目录MFD{charuserName[10];charpassword[10];UFD*user;}MFD;MFDuserTable[MaxUser];intused=0;//定义MFD目录中用已有的用户数typedefstructuser_file_directory//用户文件目录文件UFD{//charfileName[10];fileTable*file;user_file_directory*next;}UFD;//UFD*headFile;typedefstructfileTable//文件块结构体{charfileName[10];intstrat;//文件在磁盘存储空间的起始地址intlength;//文件内容长度intmaxlength;//文件的最大长度charfileKind[3];//文件的属性——读写方式structtm*timeinfo;boolopenFlag;//判断是否有进程打开了该文件//fileTable*next;};(2)结构体相互之间的调用关系图:os.采用二级目录实现文件管理3图4结构体关系图2.模块结构(1)所用函数及其功能:voidInit();//初始化文件树intParseCommand();//接受输入的命令并把其分解成操作名和路径文件名voidExecuteCommand();//执行命令,分别执行edit,del,dir,exit命令inteditComd();//处理edit命令,即创建文件,只要创建表示文件的节点即可,内容及大小不考虑intdelComd();//处理del命令,即删除指定文件,不存在是给出错误信息intdirComd();//处理dir命令。问了能显示的看出创建文件和删除文件是否成功,把根目录的文件都显示出来intFindFilename(charPara2[]);//查找文件名structFileNode*CreateFileNode(charfilename[],intisdir,inti_nlink);//创建结点intGetInput(char*buffer,unsignedintbuffer_len);//获取输入(2)所使用变量structFileNode*cp,*tp,*root;//*cp,*tp,*root是根目录节点charpath[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径charPara1[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];//para1数组存储输入的命令,para2数组存储输入的文件名charfilename[FILENAME_LEN],tmp;unsignedinti,j;os.采用二级目录实现文件管理4五、详细设计1.主函数流程图图5主函数流程图os.采用二级目录实现文件管理52.创建文件函数流程图图6创建文件函数流程图具体函数实现过程如下:inteditComd(){//chartmp;structFileNode*temp=CreateFileNode(,0,0);intsign;structFileNode*tp;//路径不能为空if(strlen(Para2)==0){printf(\n命令格式有错误.\n);return0;}//长度检查if(strlen(Para2)50)os.采用二级目录实现文件管理6{printf(\n文件名过长\n);return0;}//格式检查if(!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/')){printf(文件名格式有错!\n);/*文件首字母可以为'字母'或'数字'或'_'或'/'或'回车'*/return0;}//获取文件名sign=FindFilename(Para2);if(sign==0)return0;if(cp-isdir!=1)//如当前指针指向的是文件,则报错{printf(youcannoteditafileinunderafile!\n);return0;}//创建文件结点,并插入到指定目录下tp=CreateFileNode(,1,0);strcpy(tp-filename,filename);tp-isdir=0;tp-i_nlink=0;if(cp-child==NULL){tp-parent=cp;tp-child=NULL;cp-child=tp;tp-sibling_prev=NULL;tp-sibling_next=NULL;}else{temp=cp;//用temp找到新结点插入处os.采用二级目录实现文件管理7temp=temp-child;while(temp-sibling_next)//findthelastsibingnode{temp=temp-sibling_next;if(strcmp(temp-filename,filename)==0&&temp-isdir==0){printf(此文件名已存在\n);//重名报错return0;}}//找到了最后一个结点temp-sibling_next=tp;tp-parent=NULL;tp-child=NULL;tp-sibling_prev=temp;tp-sibling_next=NULL;}return1;}3.删除文件函数流程图图7删除函数流程图os.采用二级目录实现文件管理8具体函数实现过程如下:intdelComd(){//chartmp;intsign;structFileNode*temp;//参数不能为空if(strlen(Para2)==0){printf(\n命令格式有错误.\n);return0;}//获取文件名sign=FindFilename(Para2);if(sign==0)return0;//用temp指向要删除的结点if(cp-child){temp=cp-child;while(temp-sibling_next&&(strcmp(temp-filename,filename)!=0||temp-isdir!=0))temp=temp-sibling_next;if(strcmp(temp-filename,filename)!=0){printf(不存在该文件!\n);return0;}}else{printf(不存在该文件!\n);return0;}os.采用二级目录实现文件管理9//要删除的不能是目录if(temp-isdir!=0){printf(ERROR!该命令只能删除文件,不可删除目录!\n);return0;}//如仍有用户使用该文件,则不能删除if(temp-i_nlink!=0){printf(还有用户共享了该文件,不能删除!\n);return0;}//删除工作if(temp-parent==NULL)//不是第一个孩子{temp-sibling_prev-sibling_next=temp-sibling_next;if(temp-sibling_next)//处理是最后一个兄弟的情况temp-sibling_next-sibling_prev=temp-sibling_prev;temp-sibling_prev=temp-sibling_next=NULL;}//ifelse//第一个孩子{if(temp-sibling_next)//处理是最后一个兄弟的情况temp-sibling_next-parent=temp-parent;temp-parent-child=temp-sibling_next;}//elsefree(temp);return1;}os.采用二级目录实现文件管理104.分解命令函数流程图图8分解命令函数流程图六、测试修改及运行结果1.实际运行结果:初始界面os.采用二级目录实现文件管理112.键入用户名和密码创建账号3.登陆4.文件操作(1)创建文件os.采用二级目录实现文件管理12(2)写文件(3)读文件(4)显示文件os.采用二级目录实现文件管理13(5)关闭文件(6)删除文件七、结束语虽然我们做过很多次课程设计了,但是感觉自己还有好多需要学习的地方,接到题目要求时,设计大体的框架,考虑好所使用的数据结构,然后用高级编程语言分模块的把架子的思路编写出来,调试,运行,再看看是不是符合题目的要求,上网找些资料,看看想想是不是要提高要求,才可以满足实际的需要,最后把收集的劳动成果组合起来,一个小程序终于成型了,虽然每次的过程差不多都一样,但是每次都会有不同的体会。在这中间,敲代码,调试程序的过程比较枯