




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录一课程设计目的及要求1二相关知识2三。 题目分析3四概要设计4五代码及流程5六运行结果20七设计心得23八参考文献24一课程设计目的及要求深入了解文件管理系统,初步掌握文件管理系统的实现方法。用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。编写一程序,模拟一个简单的文件管理系统。树型结构,目录下可以是目录,也可以是文件.在此文件管理系统,可实现的操作有:改变目录:格式:cd 目录名显示目录:格式:dir <目录名创建目录:格式:md 目录名删除目录:格式:rd <目录名>新建文件:格式:edit
2、<文件名>删除文件:格式:del <文件名退出文件系统:exit二相关知识1。文件结构体struct FileNode char filenameFILENAME_LEN;/文件名/目录名int isdir;/目录文件识别标志int i_nlink;/文件的链接数int adr;/文件的地址struct FileNode *parent, *child;/指向父亲的指针和指向左孩子的指针struct FileNode sibling_prev, sibling_next;/指向前一个兄弟的指针和指向/后一个兄弟的指针。;整个文件系统采用二叉树型存储结构,初始化文件树如下:图
3、2-1 初始目录树2。所使用函数及其功能int Main(); /主函数void Init();/初始化文件树int ParseCommand();/接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();/执行命令,分别执行cd,edit,md,del,rd, dir,exit命令int cdComd(); /改变目录功能处理int editComd();/处理edit命令,即创建文件,只要创建表示文件的节点即可,内容及大小不考虑int mdComd(); /创建目录int delComd();/处理del命令,即删除指定文件,不存在是给出错误信息int di
4、rComd();/处理dir命令,显示目录int rdComd(); /删除目录int FindFilename(char Para2);/查找文件名struct FileNode CreateFileNode(char filename,int isdir,int i_nlink);/创建结点int GetInput(char buffer,unsigned int buffer_len);/获取输入3所使用的变量struct FileNode *cp, tp, root;/ *cp, *tp, root是根目录节点char pathINPUT_LEN-COMMAND_LEN;/记录当前走过
5、的路径char Para1COMMAND_LEN,Para2INPUT_LENCOMMAND_LEN;/para1数组存储输入的命令,para2数组存储输入的文件名char filenameFILENAME_LEN,tmp;unsigned int i,j;三 题目分析1文件系统采用二叉树型存储结构,结点结构如下:struct FileNode char filenameFILENAME_LEN;/文件名/目录名int isdir;/目录、文件的识别标志(0为文件,1为目录)int i_nlink;/文件的链接数/int adr;/文件的地址struct FileNode parent, *c
6、hild;/指向父亲的指针和指向左孩子的指针struct FileNode sibling_prev, sibling_next;/指向前一个兄弟的指针和指向后一个兄弟的指针。;2目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开3功能具体描述:改变目录:改变当前工作目录,目录不存在时给出出错信息显示目录:显示指定目录下或当前目录下所有文件和一级目录(选做:带/s参数的dir命令,显示所有子目录)创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。删除目录:删除指定目录下所有文件和子目录.要删目录不空时,要给出提示是否要删除.创建文件:创建指定名字的文件,只要创建表
7、示文件的节点即可,内容及大小不考虑。删除文件:删除指定文件,不存在时给出出错信息.退出文件系统:exit4、总体流程:初始化文件目录;输出提示符,等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。四概要设计1在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统.2文件存储空间的分配采用显式链接分配.为了实现创建和删除文件必须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件。3. 数据结构与树结构。数据结构是计算机存储、组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的
8、数据元素的集合。树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。结点的前趋结点称为该结点的”双亲",结点的后趋结点称为该结点的”孩子”,同一结点的”孩子"之间互称”兄弟”。4文件目录结构采用多级目录结构。为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指5。 要有分解函数对输入的命令进行分解。以识别那部分是哪部分是命令,哪部分是路径
9、和文件名。6。 最后要有执行函数。来执行输入的创建文件命令。五代码及流程开始初始化文件树获取键盘输入分解命令执行命令显示目录退出改变目录删除目录文件创建目录/文件图51 主函数流程图2)edit()创建文件函数流程图图52 创建文件函数流程图开始检查命令格式获取文件名不存在该文件删除的是目录由用户共享该文件报错提示处理删除的是第一个孩子情况处理删除的不是第一个孩子情况结束图53 删除函数流程图4)ParseCommand()分解命令函数流程图图5-4 分解命令函数流程图5)改变目录函数rdComd()图 55 改变目录函数流程图源代码:include stdio.h>#include i
10、ostream>#include <string。h>include <ctype.h>#include stdlib。hdefine FILENAME_LEN 21define INPUT_LEN 81define COMMAND_LEN 11using namespace std;void Init();/初始化文件树int ParseCommand();/接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();/执行命令int cdComd();/处理cd命令int editComd();/处理edit命令int delCom
11、d();/处理del命令int dirComd();/处理dir命令int mdComd();/处理md命令int rdComd();/处理rd命令int FindPath(char ph);/寻找参数ph所指向的路径int FindFilename(char Para2);/从参数Para2中找到要建立或删除的文件、目录名,并把指针只想其父亲结点struct FileNode CreateFileNode(char filename,int isdir,int i_nlink);/创建结点int GetInput(char buffer,unsigned int buffer_len);/获
12、取输入int CheckCommand();/命令检查int GetDir(int begin,char path,char *curDir);/获取路径struct FileNode cp, tp, *root;char pathINPUT_LENCOMMAND_LEN;/记录当前走过的路径char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;char curpathINPUT_LENCOMMAND_LEN,tmppathINPUT_LEN-COMMAND_LEN;char filenameFILENAME_LEN,tmp;unsigned int
13、 i,j;/int i,j;struct FileNode /结点结构char filenameFILENAME_LEN;/文件名/目录名int isdir;/目录文件识别标志int i_nlink;/文件的链接数struct FileNode parent, child;/指向父亲的指针和指向左孩子的指针struct FileNode sibling_prev, sibling_next;/指向前一个兄弟的指针和指向后一个兄弟的指针。;/创建结点struct FileNode CreateFileNode(char filename,int isdir,int i_nlink) struct
14、 FileNode* node=(struct FileNode)malloc(sizeof(struct FileNode));/申请结点空间/相应内容赋初值 strcpy(nodefilename,filename);nodeisdir=isdir;nodei_nlink=i_nlink;nodeparent=NULL;node>child=NULL;node>sibling_prev=NULL;nodesibling_next=NULL; return node;/初始化文件树void Init() struct FileNode *binNode,*usrNode, uni
15、xNode,etcNode,*libNode,*userNode,binNode2,liuNode,*sunNode,ftiNode;strcpy(path,”/”); /根目录写入当前路径/创建文件树的结点binNode=CreateFileNode(”bin”,1,0);usrNode=CreateFileNode(”usr",1,0);unixNode=CreateFileNode("unix”,0,0);etcNode=CreateFileNode("etc”,1,0);libNode=CreateFileNode(”lib”,1,0);userNode=
16、CreateFileNode("user”,1,0);binNode2=CreateFileNode(”bin”,1,0);liuNode=CreateFileNode("liu",1,0);sunNode=CreateFileNode(”sun",1,0);ftiNode=CreateFileNode(”fti",1,0);cp=tp=root=CreateFileNode("/”,1,0);/结点相应内容赋值root-parent=NULL;rootchild=binNode;rootsibling_prev=root-sibli
17、ng_next=NULL;binNode>parent=root;binNodechild=NULL;binNode>sibling_prev=NULL;binNodesibling_next=usrNode;usrNode>parent=NULL;usrNode>child=libNode;usrNode->sibling_prev=binNode;usrNode-sibling_next=unixNode;unixNodeparent=NULL;unixNodechild=NULL;unixNodesibling_prev=usrNode;unixNodesi
18、bling_next=etcNode;etcNode-parent=NULL;etcNode>child=NULL;etcNode-sibling_prev=unixNode;etcNode->sibling_next=NULL;libNode-parent=usrNode;libNodechild=liuNode;libNode->sibling_prev=NULL;libNode-sibling_next=userNode;userNode-parent=NULL;userNode>child=NULL;userNode->sibling_prev=libNo
19、de;userNode-sibling_next=binNode2;binNode2parent=NULL;binNode2child=NULL;binNode2sibling_prev=userNode;binNode2sibling_next=NULL;liuNode-parent=libNode;liuNode->child=NULL;liuNode>sibling_prev=NULL;liuNode>sibling_next=sunNode;sunNode->parent=NULL;sunNode-child=NULL;sunNodesibling_prev=l
20、iuNode;sunNodesibling_next=ftiNode;ftiNodeparent=NULL;ftiNodechild=NULL;ftiNodesibling_prev=sunNode;ftiNodesibling_next=NULL;/获取文件或目录名,并把指针指向其父亲结点int FindFilename(char Para2) i=strlen(Para2)1;j=0;while(Para2i!=/ i=0)filenamej=Para2i;i; j+;filenamej=0;/获得逆序的文件或目录名,存入filename中if(i0) Para2i+1='0
21、9;else Para2i=0;j-;for(i=0;istrlen(filename)/2;i+,j-) /filename逆转,获得正确的文件或目录名tmp=filenamei;filenamei=filenamej;filenamej=tmp;if(strlen(Para2)>0) /查找路径int sign=FindPath(Para2);if(sign=0) return 0;return 1;/缓冲区安全输入子函数/如果输入超过buffer_len,则截取前buffer_len-1长度的输入,/buffer_len处字符用'/0代替int GetInput(char*
22、 buffer,unsigned int buffer_len) unsigned int count=0;while(count<buffer_len)if((buffercount=getchar()=10) buffercount=0';return count;count+;while(getchar()!=10);bufferbuffer_len1='0;return 1;/改变目录函数int cdComd() if(!CheckCommand()) /命令检查return 0;if(strcmp(Para2,”。")=0) /对cd。命令的处理int
23、 i;while(cpsibling_prev)cp=cpsibling_prev;if(cp-parent) cp=cp->parent; /找到父亲结点else return 0; /对当前路径进行相应处理i=strlen(path);while(pathi!=/&i0) i-;if(i!=0)pathi=0;elsepathi+1=0;else FindPath(Para2);/查找路径return 1;/创建目录函数int mdComd() struct FileNode temp,tp;temp=CreateFileNode("",1,0);int
24、sign;if(strlen(Para2)=0) /参数不能为空printf(”n命令格式有错误.n");return 0;if(strlen(Para2)20) /长度检查printf(”n目录名过长n”);return 0;/格式检查if (!(isalpha(Para20)|Para20=_|Para20='0'|Para20=/')printf("目录名格式有错!n");/ 目录首字母可以为'字母'或数字或/'/return 0;sign=FindFilename(Para2);/获取目录名if(sign=0
25、)return 0;if(cp>isdir!=1) /如当前指针指向的是文件,则报错printf(”you cannot edit a directory in under a file!n”);return 0;tp=CreateFileNode(filename,1,0); /创建目录结点,并插入到指定目录下if(cpchild=NULL)tp->parent=cp;tp-child=NULL; cp->child=tp; tpsibling_prev=NULL; tpsibling_next=NULL;else temp=cp;/用temp找到新结点插入处 temp=t
26、emp>child; while(tempsibling_next ) /find the last sibing node temp=temp-sibling_next; if(strcmp(tempfilename,filename)=0temp-isdir=1) printf("此目录名已存在n");/重名报错return 0; /找到了最后一个结点tempsibling_next=tp;tpparent=NULL;tp->child=NULL;tp-sibling_prev=temp;tp>sibling_next=NULL;return 1;/删
27、除目录函数int rdComd() int sign;struct FileNode temp;char cmd2;if(!CheckCommand()) /命令检查return 0;sign=FindFilename(Para2); /获取目录名if(sign=0) return 0;if(cpchild) /用temp指向要删除的结点temp=cpchild;while(tempsibling_next (strcmp(temp-filename,filename)!=0 | temp>isdir!=1))temp=tempsibling_next;if(strcmp(tempfil
28、ename,filename)!=0) printf(”不存在该目录!n”);return 0;else printf(”不存在该目录!n");return 0;if(tempisdir!=1) /要删除的不能是文件printf(”ERROR!该命令只能删除目录,不可删除文件!n");return 0;if(tempchild) /如仍有用户使用该目录,则不能删除printf(”n该目录不为空,您确定要删除吗?Y/N!n”); GetInput(cmd,2);if(strcmp(cmd,"n”)=0|strcmp(cmd,"N”)=0)return 0;
29、/删除工作 if(temp-parent=NULL) /不是第一个孩子temp->sibling_prevsibling_next=tempsibling_next;if(temp->sibling_next)/处理是最后一个兄弟的情况temp>sibling_next-sibling_prev=temp>sibling_prev; temp-sibling_prev=tempsibling_next=NULL;/ifelse /第一个孩子if(temp-sibling_next)/处理是最后一个兄弟的情况temp>sibling_nextparent=tempp
30、arent; tempparent>child=temp->sibling_next;free(temp);return 1;/显示目录子函数int dirComd() if(strlen(Para2)0)int sign=FindPath(Para2); /查找路径if(sign=0) return 0; elseprintf("ns>”, path);if(cp!=root)printf(” DIR sn”,”。”);if(cp-child=NULL) /指定目录为空return 0; tp=cp;tp=tp>child; /指定目录不为空,显示其所有子目
31、录及文件名while(tp) if(tp>isdir)printf(" DIR %sn”,tp->filename);elseprintf(" <FILE sn",tp>filename);tp=tp-sibling_next;return 0;/创建文件函数int editComd() struct FileNode * temp=CreateFileNode(”",0,0);int sign;struct FileNode tp;if(strlen(Para2)=0) /路径不能为空printf(”n命令格式有错误。n&quo
32、t;);return 0;if(strlen(Para2)20) /长度检查printf("n文件名过长n”);return 0;/格式检查if (!(isalpha(Para20)|Para20=_Para20=0Para20=/)printf(”文件名格式有错!n");/* 文件首字母可以为字母或'数字'或'_或'/或'回车'/return 0;sign=FindFilename(Para2);/获取文件名if(sign=0)return 0;if(cp->isdir!=1) /如当前指针指向的是文件,则报错prin
33、tf(”you cannot edit a file in under a file!n”);return 0;/创建文件结点,并插入到指定目录下tp=CreateFileNode(”,1,0);strcpy(tpfilename,filename);tp>isdir=0;tpi_nlink=0;if(cp>child=NULL)tpparent=cp; tp>child=NULL; cpchild=tp; tpsibling_prev=NULL; tp->sibling_next=NULL;else temp=cp; temp=temp-child;/用temp找到新
34、结点插入处 while(tempsibling_next ) /find the last sibing node temp=temp-sibling_next; if(strcmp(temp-filename,filename)=0temp-isdir=0) printf(”此文件名已存在,请重新输入n”); /重名报错 return 0;/找到了最后一个结点tempsibling_next=tp;tpparent=NULL;tpchild=NULL;tp-sibling_prev=temp;tp-sibling_next=NULL;return 1;/删除文件子函数int delComd(
35、) int sign;struct FileNode temp;if(strlen(Para2)=0) /参数不能为空printf(”n命令格式有错误。n”);return 0;sign=FindFilename(Para2); /获取文件名if(sign=0) return 0;if(cp-child) /用temp指向要删除的结点temp=cpchild;while(temp>sibling_next&(strcmp(temp-filename,filename)!=0|temp-isdir!=0))temp=tempsibling_next;if(strcmp(tempfi
36、lename,filename)!=0) printf(”不存在该文件!n”);return 0;else printf(”不存在该文件!n");return 0;if(temp>isdir!=0) /要删除的不能是目录printf(”ERROR!该命令只能删除文件,不可删除目录!n”);return 0;if(tempi_nlink!=0) /如仍有用户使用该文件,则不能删除printf(”还有用户共享了该文件,不能删除!n”);return 0;/删除工作 if(tempparent=NULL) /不是第一个孩子tempsibling_prev-sibling_next=t
37、empsibling_next;if(tempsibling_next)/处理是最后一个兄弟的情况temp-sibling_next->sibling_prev=temp-sibling_prev; temp>sibling_prev=temp-sibling_next=NULL;else /第一个孩子if(tempsibling_next)/处理是最后一个兄弟的情况tempsibling_next-parent=temp-parent; temp->parent-child=tempsibling_next;free(temp);return 1;/获取当前目录名子函数in
38、t GetDir(int begin,char path,char *curDir) int i=0;int len=strlen(path);while(!((pathbegin=)(pathbegin='/))beginlen) curDiri+=pathbegin+; curDiri=0;return begin+1;/查找路径函数int FindPath(char *ph) struct FileNode temp; /struct FileNode *tp,*temp;char oldpathINPUT_LENCOMMAND_LEN;unsigned int i=0; /in
39、t i=0int sign=1;if(strcmp(ph,”/”)=0) /ph是根目录cp=root;strcpy(path,”/");return 1;temp=cp;strcpy(oldpath,path);/保留原路径和指针if(ph0=/) /指针指向根目录的左孩子cp=root>child;i+; /滤过'/'strcpy(path,”/”);else if(cp!=NULL&cp!=root)strcat(path,”/");if(cp&cp-child) if(cp-isdir)cp=cp>child;/指针指向当
40、前目录的左孩子else printf(”路径错误!n”);return 0;while(i=strlen(ph)&cp) /继续查找指定路径,如遇到文件则报错int j=0;if(phi=/'&cp>child) i+; /略过/if(cp->isdir)cp=cpchild; /继续查找下级目录else printf(”路径错误!n”);return 0;strcat(path,”/”); while(phi!=/&i=strlen(ph) / curpath 记录当前要找的路径名curpathj=phi;i+; j+;curpathj=0'
41、;while(strcmp(cp-filename,curpath)!=0|(cp-isdir!=1))&cpsibling_next!=NULL) cp=cpsibling_next; if(strcmp(cp-filename,curpath)=0)if(cp-isdir=0) strcpy(path,oldpath);cp=temp;printf(”是文件不是目录。n");return 0;strcat(path,cpfilename);if(strcmp(cp-filename,curpath)!=0|cp=NULL) strcpy(path,oldpath);cp=temp;printf(”输入路径错误n”);return 0;return 1;/命令检查函数int CheckCommand() if(strlen(Para2)=0) printf(”命令语法不正确。n");return 0;return 1;/分解命令子函数in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024湖南怀化市新晃侗族自治县招聘国有企业工作人员拟聘用人员笔试参考题库附带答案详解
- 2023-2024学年人教版高中信息技术必修一第三章第四节《数据分析报告与应用》教学设计
- 2024年浙江嵊州市水务投资发展集团有限公司员工招聘25人笔试参考题库附带答案详解
- 2024年度长江产投公司招聘4人笔试参考题库附带答案详解
- 2024年宿州泗县县属国有企业公开招聘工作人员33人笔试参考题库附带答案详解
- 2025年河南测绘职业学院单招职业技能测试题库一套
- 2024年中广核环保产业有限公司招聘7人笔试参考题库附带答案详解
- 2024-2025学年初升高衔接英语句子成分 教学设计
- 2024年中国中医药出版社招聘笔试参考题库附带答案详解
- 《记念刘和珍君》《为了忘却的记念》联读教学设计
- 电焊工安全教育培训课件
- 公共关系理论与实务ppt课件(完整版)
- 外研版五年级下册小学英语全册教学课件PPT
- 中国石油大学(华东)-朱超-答辩通用PPT模板
- 双胎妊娠 PPT课件
- 商业动线设计(修改版)
- 【讲座】情境性试题:基于《中国高考评价体系》的高考语文命题研究
- 建筑行业钢桁架等制作工艺流程图
- 承德市普通住宅区物业服务等级和基准价格
- 环保考核试卷18285(含答案)
- HG20592-2009法兰(PL)法兰盖(BL)精加工尺寸
评论
0/150
提交评论