




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计报告题目:树型目录文件系统 学 院 计算机学院 专 业 网络工程 年级班别 04级(2)班 学 号 3104007225 学生姓名 王 维 铭 指导教师 林 穗 成 绩 200 7年 1月 树型目录文件系统一、 设计思想: 本课程设计目的是实现树型目录结构文件系统,本人在实现过程中也利用二叉树,其中每个节点都有父指针,子指针和兄弟指针,其中子指针指向该目录下的第一个子节点,而该子节点的父指针则指向它的上级目录。目录下各子节点用兄弟指针连接起来。文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛出。文件打开则把文件的名称及其父指针写到文件列表同时置文件打开标志为1,文件关闭则把文件从打开列表中删除,同时置文件打开指针为0,文件读取和写入都要检查文件是否在文件打开列表中,未打开文件不能读写,只读文件不能写,只写文件不能读。文件夹和文件创建,文件夹和文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,没有则把文件夹或文件连接到该目录下的最后一个子节点,作为它的兄弟节点。文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,删除文件夹时利用了中序历遍来删除子树。二、 系统结构说明系统结构如下图: root为根结点,root下有五个用户,每个用户有自己的文件夹或文件,系统初始化时为每个用户创建一个file1文件。文件夹内容只有名称和打开标志。文件除了名称和打开标志,还有文件的访问权限,文件类型以及文件长度。其中文件的访问权限、文件类型、文件长度单独作为一个结构体,其它和文件夹结构体相同,也同用一个结构体。打开文件列表的结构体包括文件名和文件的父节点地址,打开文件夹的栈中包括文件夹名称及其地址三、 数据结构的说明 /普通文件的结构体struct filechar type; /文件类型0-文本文件 1-可执行文件 2-记录型文件char right; /文件的权限0可读 1可写 2可读可写int f_length; /文件长度;typedef struct file file;/文件夹或文件的结构体struct fcb char kind; /kind=1为文件夹 kind=2为文件char name20; /文件夹或文件名称bool open;file if_file; struct fcb *parent; struct fcb *brother;struct fcb *child;typedef struct fcb ff;/root和fcp为全局变量ff *root;/根节点ff *fcp=null;/判断是否有拷贝文件/打开项的结构体typedef structchar name20;/名称ff *node; /指针,打开的是文件夹记录文件夹的地址,是文件记录文件的父节点地opened;int opfo=0; /记录文件夹打开数目,最多20opened folderopened20;/记录文件打开文件夹int opfi=0; /记录文件打开数目,最多20opened fileopened20;/记录打开文件四、 函数清单及部分函数流程图 /函数声明/void init();/初始化创建根节点void initopen();/初始化打开文件列表或打开文件夹文件列表ff* creat(ff *parent,char name20,char kind);/创建文件或文件夹void delet(ff *parent,char delname20,char kind);/删除文件文件夹void delsub(ff *delp); /删除子树(配合删除文件夹使用)void openfolder(ff *parent, char name20);/打开文件夹void openfile(ff *parent, char name20);/打开文件void closefo(); /关闭文件夹void closefile(char name20); /关闭文件void read(ff*parent,char name20); /读文件void write(char name20); / 写文件void show(); /显示初始界面void initfile(); /初始化每个用户,为每个用户创建一个file1文件int ishaveopen(ff *bedel); /判断文件夹下是否有打开的文件或文件夹void filecpy(ff *parent,char name20);/文件复制函数void pastefile(ff *parent); /文件粘贴主函数流程图:主函数开始执行时,先初始化。初始化包括创建root根目录,创建user0user4五个用户,为每个用户创建一个file1的文件。初始化完毕后,显示选择用户和退出系统两个操作,列出用户。选择1则进入选择用户界面,选择用户后则列出用户目录下的内容。同时显示操作界面。选择操作后,执行相应的操作。执行完毕回到选择操作界面。创建文件夹或文件函数流程图(creat(): 创建文件或文件夹首先通过主函数选择操作来传递参数,kind1创建文件夹,kind2创建文件。文件或文件夹名称是由用户输入。文件或文件夹的父节点由folderopenedopfo-1.node来传递。如果当前目录下由同名文件或同名文件夹则创建文件或创建文件夹不成功。当前目录是空目录则创建的文件或文件夹是当前目录的首个子节点。parent指针指向当前目录,当前目录的child指针指向文件或文件夹。当前目录不为空,则把文件或文件夹连接到当前目录下最后的子节点后面,作为最后的兄弟节点。删除文件或文件夹函数delet()的流程图:同样删除文件或文件夹的类型参数由用户选择操作时传递。kind=1删除文件夹,kind2删除文件。名称也由用户输入。文件在打开列表或文件夹中有打开的文件,文件或文件夹不能删除,目录下没有该文件或文件夹删除失败,删除失败时返回相应的信息。如果目录下有该文件或文件夹,而且文件没打开,或文件夹中没有打开的文件,则删除该释放该节点或该子树。返回删除成功信息。流程图如下:文件打开函数及其流程图openfile():文件打开,只能但开当前目录下的文件,首先查找文件是否在打开文件列表中,在则返回文件已经在打开文件列表中的信息,不是,则查看当前目录有没有该文件,有则打开,同时把文件名及其父节点地址写到文件队列中,置文件打开标志为1。返回打开成功信息。文件被打开后,返回上层目录或到别的目录下,文件不会从打开文件列表中删除。除非在文件所在的目录下执行关闭文件操作关闭此文件文件才从打开文件列表中删除。其流程图如下: 文件删除函数说明及其流程图: 文件删除,只能对当前的目录下的文件进行操作。文件不在打开队列中,关闭失败,返回提示信息。在打开列表中则关闭文件,置文件打开标志为0。 流程图如下: 文件夹打开和关闭函数说明: 文件夹打开,只能打开当前目录下的文件夹打开后,文件夹名称及其节点地址写到文件夹堆栈中(如果打开的是同一个目录,不用写打开文件夹堆栈),同时列出文件夹目录下的内容。关闭文件夹(返回上级目录)则把当前目录从打开文件夹堆栈中抛出,同时打开上级目录。以下是打开文件夹和关闭文件夹函数源程序:打开文件夹:void openfolder(ff *parent, char name20)ff *select,*beopen;if(!parent-child) /目录为空printf(没有此文件!);return;beopen=parent-child;while(beopen) /寻找要打开的文件夹if(beopen-kind=1)if(strcmp(beopen-name,name)=0) /文件夹被找到 break;if(!beopen-brother)printf(文件夹不存在!n);return;beopen=beopen-brother; /while endif(!beopen-child)printf(该文件夹是空的!n);if(opfo=2)if(folderopenedopfo-2.node=parent)if(strcmp(folderopenedopfo-1.name,name)=0)return;folderopenedopfo.node=beopen;strcpy(folderopenedopfo.name,beopen-name);opfo+;return;if(beopen-child)select=beopen-child;while(select) /列出文件夹下的内容for(int i=0;iname);if(select-kind=1)printf(文件夹)t);if(select-kind=2)if(select-if_file.type=0)printf(文本文件 %dk)t,select-if_file.f_length);if(select-if_file.type=1)printf(可执行文件 %dk)t,select-if_file.f_length);if(select-if_file.type=2)printf(记录型文件 %dk)t,select-if_file.f_length);select=select-brother;printf(n);if(opfo=2)if(folderopenedopfo-2.node=parent) /打开文件夹堆栈中已有,不写堆栈if(strcmp(folderopenedopfo-1.name,name)=0)return;folderopenedopfo.node=beopen; /打开文件夹不在堆栈,写堆栈 strcpy(folderopenedopfo.name,beopen-name);opfo+;return;/关闭文件夹源程序: /文件夹关闭void closefo()if(opfo=2) /返回到根结点,不能再执行返回操作printf(这里是根节点!n);show();opfo-;return;opfo-;openfolder(folderopenedopfo-2.node,folderopenedopfo-1.name);folderopenedopfo.node=null;/ 删除子树函数(void delsub()和判断文件夹下是否有文件打开函数(int ishaveopen())这两个函数都是用来辅助删除文件夹函数的,删除子树函数用后序历遍树的方法 删除子树是递归函数。ishaveopen()函数利用先序历遍树的方法判断文件夹下是否有打开文件,也是递归函数。当有打开文件是返回1,否则返回0。删除子树函数源程序:/删除子树void delsub(ff *delp)if(delp-brother) delsub(delp-brother);/历遍brother子树if(delp-child) delsub(delp-child);/历遍child子树free(delp);/释放节点判断文件夹下是否有打开文件函数源程序:/辅助del函数中的删除文件夹int ishaveopen(ff *bedel)if(bedel-open=true)return 1;if(bedel-brother)ishaveopen(bedel-brother);if(bedel-child)ishaveopen(bedel-child);elsereturn 0;文件复制及其粘贴函数的说明: 文件复制,在当前目录下查找要复制的文件,若查找不到,返回信息,拷贝失败。若查找到了,则创建一个新节点,把要复制的文件的信息写道新节点的相应的项里。 文件粘贴,首先判断fcp是否为空,空则表明没有复制文件,不能执行粘贴操作。不为空,则查找当前目录下是否有同名文件,有则询问用户是否要覆盖已存在的文件,是则把复制代替要被覆盖的文件,并释放被覆盖文件的资源。否则退出。若是没有和复制文件同名的文件则把文件连到目录下的最后的子节点后。以下是粘贴文件的源程序: /粘贴文件/void pastefile(ff *parent)ff *select,*cover;char opt;if(!fcp)printf(没有被拷贝的文件,请先拷贝文件!n);return;if(!parent-child) /目录是空目录fcp-child=parent;parent-child=fcp;fcp=null;printf(粘贴成功!n);return;select=parent-child; if(select-kind=2)/覆盖的文件是目录下第一个子节点 if(strcmp(select-name,fcp-name)=0)printf(该目录下已经有此文件!是否覆盖(y/n)?);getchar();scanf(%c,&opt);if(opt=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;free(select);printf(覆盖成功!n);fcp=null;return;elsereturn;while(select-brother)/查找目录下是否有同名文件if(select-brother-kind=2)if(strcmp(select-brother-name,fcp-name)=0)printf(该目录下已经有此文件!是否覆盖(y/n)?);getchar();scanf(%c,&opt);if(opt=y|opt=y)/覆盖同名文件cover=select-brother;fcp-brother=cover-brother;fcp-child=cover-child;fcp-parent=cover-parent;select-brother=fcp;free(cover);printf(覆盖成功!n);fcp=null;return;else return; select=select-brother;select-brother=fcp;/目录下没有同名文件fcp=null;return; 五、程序运行效果: 初始界面:选择1进入界面:选择用户后进入的界面: 用户1下有文件file1建立文件成功和失败图示: 建立同名文件时,创建出错不同名文件创建成功。删除文件成功及失败图示:1、 删除文件file1,file1没打开。删除成功:目录只剩下file2。2、 删除ff文件,目录下没有此文件,删除失败: 3、 文件file2打开后删除,删除失败:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药剂学居民健康考核试题及答案
- 药物政策与行业发展试题及答案
- 初级会计师财务分析技能试题及答案
- 网络规划设计师考试全景分析及试题及答案
- 2025年-黑龙江建筑安全员知识题库
- 税务合规违约的后果分析试题及答案
- 知识产权的社会功能与法律保障试题及答案
- 卫生管理证书考试内容与考试形式分析试题及答案
- 高中语文名著导读呐喊读后感素材新人教版
- 文化产业管理证书Exam试题及答案探索
- 宁夏中考试题历史及答案
- 2024-2025学年二年级语文下册统编版第四单元达标卷(单元测试)(含答案)
- 2025年郑州澍青医学高等专科学校单招职业适应性测试题库新版
- 《企业运营管理基础》课件
- 《马达保护器培训》课件
- 2024年01月广发银行2024年境内直属分行(大连分行)副行长职位选聘笔试历年参考题库附带答案详解
- 2025年水稻种植农户互助合作合同3篇
- 第19课《资本主义国家的新变化》说课稿-2023-2024学年高一下学期统编版(2019)必修中外历史纲要下
- 口腔颌面外科基础知识与基本操作
- 2025年福建泉州交通发展集团招聘笔试参考题库含答案解析
- 大数据背景下的高血压诊断与治疗效果研究
评论
0/150
提交评论