还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
课程设计任务书计算机科学与技术专业年级班
1、设计题目文件管理系统设计
2、主要内容设计一个简单的文件管理系统来模拟文件操作命令的执行
3、具体要求设计和调试一个简单的文件管理系统来模拟文件管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法具体要求如下⑴设计一个支持n个用户的文件系统,每个用户可拥有多个文件;⑵采用二级或二级以上的多级文件目录管理;⑶对文件应设置存取控制保护方式,如“只能执行”、“允许读”、“允许写”等;⑷系统的外部特征应接近于真实系统,可设置下述文件操作命令建立文件、打开文件、关闭文件、删除文件、读文件、写文件、复制文件、查询目录⑸通过键盘(或鼠标)使用该文件系统,系统应显示操作命令的执行结果
4、进度安排2012-9-3-----2012-9-6确定系统的总体设计方案即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;2012-9-6-----2012-9-12编写程序代码并调试,再将调试通过的各个子模块进行集成调试;2012-2-12----2012-9-16归纳文档资料,完成课程设计说明书,参加课程设计答辩
5、完成后应上交的材料在课程设计完成后需要提交的成果和有关文档资料包括
1、课程设计的说明书
2、课程设计有关源程序及可运行程序(光盘或电子邮件)
6、总评成绩指导教师签名日期年月日系主任审核日期年月日
一、本设计目的及基本思想本课程设计目的是实现树型目录结构文件系统,在实现过程中利用了二叉树,其中每个节点都有父指针,子指针和兄弟指针,其中子指针指向该目录下的第一个子节点,而该子节点的父指针则指向它的上级目录目录下各子节点用兄弟指针连接起来文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛出文件打开则把文件的名称及其父指针写到文件列表同时置文件打开标志为1,文件关闭则把文件从打开列表中删除,同时置文件打开指针为0,文件读取和写入都要检查文件是否在文件打开列表中,未打开文件不能读写,只读文件不能写,只写文件不能读文件夹和文件创建,文件夹和文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,没有则把文件夹或文件连接到该目录下的最后一个子节点,作为它的兄弟节点文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,删除文件夹时利用了中序历遍来删除子树
二、系统设计2.1系统基本结构系统基本结构如下图图1系统基本结构图root为根结点,root下有五个用户,每个用户有自己的文件夹或文件,系统初始化时为每个用户创建一个file1文件文件夹内容只有名称和打开标志文件除了名称和打开标志,还有文件的访问权限,文件类型以及文件长度其中文件的访问权限、文件类型、文件长度单独作为一个结构体,其它和文件夹结构体相同,也同用一个结构体打开文件列表的结构体包括文件名和文件的父节点地址,打开文件夹的栈中包括文件夹名称及其地址2.2系统数据结构//普通文件的结构体structfile{chartype;//文件类型0-文本文件1-可执行文件2-记录型文件charright;//文件的权限0-可读1-可写2-可读可写intf_length;//文件长度};typedefstructfileFile;//文件夹或文件的结构体structFCB{charkind;//kind=1为文件夹kind=2为文件charname
[20];//文件夹或文件名称boolopen;Fileif_file;structFCB*parent;structFCB*brother;structFCB*child;};typedefstructFCBFf;//root和fcp为全局变量Ff*root;//根节点Ff*fcp=null;//判断是否有拷贝文件//打开项的结构体typedefstruct{charname
[20];//名称Ff*node;//指针,打开的是文件夹记录文件夹的地址,是文件记录文件的父节点地}opened;intOPFO=0;//记录文件夹打开数目,最多20openedfolderopened
[20];//记录文件打开文件夹intOPFI=0;//记录文件打开数目,最多20openedfileopened
[20];//记录打开文件2.3函数清单及部分函数算法流程图//函数声明/////////////////////////////voidinit;//初始化创建根节点voidinitopen;//初始化打开文件列表或打开文件夹文件列表Ff*creatFf*parentcharname
[20]charkind;//创建文件或文件夹voiddeletFf*parentchardelname
[20]charkind;//删除文件文件夹voiddelSubFf*delp;//删除子树(配合删除文件夹使用)voidopenfolderFf*parentcharname
[20];//打开文件夹voidopenfileFf*parentcharname
[20];//打开文件voidclosefo;//关闭文件夹voidclosefilecharname
[20];//关闭文件voidreadFf*parentcharname
[20];//读文件voidwritecharname
[20];//写文件voidshow;//显示初始界面voidinitfile;//初始化每个用户,为每个用户创建一个file1文件intishaveopenFf*bedel;//判断文件夹下是否有打开的文件或文件夹voidfilecpyFf*parentcharname
[20];//文件复制函数voidpastefileFf*parent;//文件粘贴主函数流程图主函数开始执行时,先初始化初始化包括创建root根目录,创建user0~user4五个用户,为每个用户创建一个file1的文件初始化完毕后,显示选择用户和退出系统两个操作,列出用户选择1则进入选择用户界面,选择用户后则列出用户目录下的内容同时显示操作界面选择操作后,执行相应的操作执行完毕回到选择操作界面创建文件夹或文件函数流程图creat创建文件或文件夹首先通过主函数选择操作来传递参数,kind=1创建文件夹,kind=2创建文件文件或文件夹名称是由用户输入文件或文件夹的父节点由folderopened[OPFO-1].node来传递如果当前目录下由同名文件或同名文件夹则创建文件或创建文件夹不成功当前目录是空目录则创建的文件或文件夹是当前目录的首个子节点Parent指针指向当前目录,当前目录的child指针指向文件或文件夹当前目录不为空,则把文件或文件夹连接到当前目录下最后的子节点后面,作为最后的兄弟节点删除文件或文件夹函数delet()的流程图同样删除文件或文件夹的类型参数由用户选择操作时传递Kind=1删除文件夹,kind=2删除文件名称也由用户输入文件在打开列表或文件夹中有打开的文件,文件或文件夹不能删除,目录下没有该文件或文件夹删除失败,删除失败时返回相应的信息如果目录下有该文件或文件夹,而且文件没打开,或文件夹中没有打开的文件,则删除该释放该节点或该子树返回删除成功信息流程图如下文件打开函数及其流程图openfile文件打开,只能但开当前目录下的文件,首先查找文件是否在打开文件列表中,在则返回文件已经在打开文件列表中的信息,不是,则查看当前目录有没有该文件,有则打开,同时把文件名及其父节点地址写到文件队列中,置文件打开标志为1返回打开成功信息文件被打开后,返回上层目录或到别的目录下,文件不会从打开文件列表中删除除非在文件所在的目录下执行关闭文件操作关闭此文件文件才从打开文件列表中删除其流程图如下文件删除函数说明及其流程图文件删除,只能对当前的目录下的文件进行操作文件不在打开队列中,关闭失败,返回提示信息在打开列表中则关闭文件,置文件打开标志为0流程图如下文件夹打开和关闭函数说明文件夹打开,只能打开当前目录下的文件夹打开后,文件夹名称及其节点地址写到文件夹堆栈中(如果打开的是同一个目录,不用写打开文件夹堆栈),同时列出文件夹目录下的内容关闭文件夹(返回上级目录)则把当前目录从打开文件夹堆栈中抛出,同时打开上级目录以下是打开文件夹和关闭文件夹函数源程序打开文件夹voidopenfolderFf*parentcharname
[20]{Ff*select*beopen;if!parent-child//目录为空{printf没有此文件!;return;}beopen=parent-child;whilebeopen//寻找要打开的文件夹{ifbeopen-kind==1{ifstrcmpbeopen-namename==0//文件夹被找到{break;}}if!beopen-brother{printf文件夹不存在!\n;return;}beopen=beopen-brother;}//whileendif!beopen-child{printf该文件夹是空的!\n;ifOPFO=2{iffolderopened[OPFO-2].node==parent{ifstrcmpfolderopened[OPFO-1].namename==0return;}}folderopened[OPFO].node=beopen;strcpyfolderopened[OPFO].namebeopen-name;OPFO++;return;}ifbeopen-child{select=beopen-child;whileselect//列出文件夹下的内容{forinti=0;i3select;i++{printf%sselect-name;ifselect-kind==1{printf文件夹\t;}ifselect-kind==2{ifselect-if_file.type==0{printf文本文件%dk\tselect-if_file.f_length;}ifselect-if_file.type==1{printf可执行文件%dk\tselect-if_file.f_length;}ifselect-if_file.type==2{printf记录型文件%dk\tselect-if_file.f_length;}}select=select-brother;}printf\n;}ifOPFO=2{iffolderopened[OPFO-2].node==parent//打开文件夹堆栈中已有不写堆栈{ifstrcmpfolderopened[OPFO-1].namename==0return;}}folderopened[OPFO].node=beopen;//打开文件夹不在堆栈,写堆栈strcpyfolderopened[OPFO].namebeopen-name;OPFO++;return;}}///////////////////////////////////////////////关闭文件夹源程序///文件夹关闭voidclosefo{ifOPFO==2//返回到根结点,不能再执行返回操作{printf这里是根节点!\n;show;OPFO--;return;}OPFO--;openfolderfolderopened[OPFO-2].nodefolderopened[OPFO-1].name;folderopened[OPFO].node=null;}//////////////////////////////////////删除子树函数(voiddelSub())和判断文件夹下是否有文件打开函数(intishaveopen)这两个函数都是用来辅助删除文件夹函数的,删除子树函数用后序历遍树的方法删除子树是递归函数Ishaveopen()函数利用先序历遍树的方法判断文件夹下是否有打开文件,也是递归函数当有打开文件是返回1,否则返回0删除子树函数源程序//删除子树voiddelSubFf*delp{ifdelp-brotherdelSubdelp-brother;//历遍brother子树ifdelp-childdelSubdelp-child;//历遍child子树freedelp;//释放节点}判断文件夹下是否有打开文件函数源程序//辅助del函数中的删除文件夹intishaveopenFf*bedel{ifbedel-open==true{return1;}ifbedel-brotherishaveopenbedel-brother;ifbedel-childishaveopenbedel-child;elsereturn0;}文件复制及其粘贴函数的说明文件复制,在当前目录下查找要复制的文件,若查找不到,返回信息,拷贝失败若查找到了,则创建一个新节点,把要复制的文件的信息写道新节点的相应的项里文件粘贴,首先判断fcp是否为空,空则表明没有复制文件,不能执行粘贴操作不为空,则查找当前目录下是否有同名文件,有则询问用户是否要覆盖已存在的文件,是则把复制代替要被覆盖的文件,并释放被覆盖文件的资源否则退出若是没有和复制文件同名的文件则把文件连到目录下的最后的子节点后以下是粘贴文件的源程序///粘贴文件//////voidpastefileFf*parent{Ff*select*cover;charopt;if!fcp{printf没有被拷贝的文件请先拷贝文件!\n;return;}if!parent-child//目录是空目录{fcp-child=parent;parent-child=fcp;fcp=null;printf粘贴成功!\n;return;}select=parent-child;ifselect-kind==2//覆盖的文件是目录下第一个子节点{ifstrcmpselect-namefcp-name==0{printf该目录下已经有此文件!是否覆盖y/n;getchar;scanf%copt;ifopt==Y||opt==y{fcp-brother=select-brother;fcp-child=select-child;fcp-parent=select-parent;parent-child=fcp;select-brother=null;select-child=null;select-parent=null;freeselect;printf覆盖成功!\n;fcp=null;return;}elsereturn;}}whileselect-brother//查找目录下是否有同名文件{ifselect-brother-kind==2{ifstrcmpselect-brother-namefcp-name==0{printf该目录下已经有此文件!是否覆盖y/n;getchar;scanf%copt;ifopt==Y||opt==y//覆盖同名文件{cover=select-brother;fcp-brother=cover-brother;fcp-child=cover-child;fcp-parent=cover-parent;select-brother=fcp;freecover;printf覆盖成功!\n;fcp=null;return;}elsereturn;}}select=select-brother;}select-brother=fcp;//目录下没有同名文件fcp=null;return;}
三、程序运行效果初始界面选择1进入界面选择用户后进入的界面用户1下有文件file1建立文件成功和失败图示建立同名文件时,创建出错不同名文件创建成功删除文件成功及失败图示
1、删除文件file1,file1没打开删除成功目录只剩下file
22、删除ff文件,目录下没有此文件,删除失败
3、文件file2打开后删除,删除失败创建文件夹成功和失败图示
1、创建文件夹new,目录中没有new文件夹,创建成功
2、在创建文件夹new,目录中有文件夹new,创建失败删除文件夹成功及其失败图示
1、首先建立多一个文件夹,folder在folder里创建文件new并打开文件new此时提示删除失败
2、关闭文件new后,删除成功此时用户下少了文件夹folder文件拷贝及其粘贴
1、首先我们在new文件夹下创建一个hello文件,并拷贝hello文件拷贝成功
2、在回到上层目录useer1,把文件粘贴在此目录下粘贴成功此时user1下多了文件hello写读文件成功及失败图示
1、读文件file2,file2没打开,读失败
2、打开文件file2,然后读取,读取成功
3、写文件,写file2,因为file2已经打开,所以写成功
4、关了文件file2后,再写文件file2,不成功显示路径:进入文件夹
1、进入文件夹new,为了更清楚看到路径,进入文件夹new后用s命令显示当前路径
2、返回操作,返回user1目录,为了更清楚看到路径,返回后用s命令显示当前路径
四、总结体会本次课程设计,本人选择了树型结构文件系统的设计这一题目刚刚开始时,不知道怎么设计,只知道大概的结构后来认真阅读课本有关的知识,知道怎样设计结构体才方便文件操作知道怎样设计后,写程序时也遇到很多的障碍,特别是指针的改接和指向和出错处理此时深感自己编程能力的不足,经过多次修改,终于设计好了该设计通过该课程设计,使我更了解了课本知识,巩固了课本知识,同时也使我的编程能力有了一定的提高。