文件管理系统C++_第1页
文件管理系统C++_第2页
文件管理系统C++_第3页
文件管理系统C++_第4页
文件管理系统C++_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一. 课程设计目的及要求二. 相关知识三. 题目分析四. 概要设计五. 代码及流程20六. 运行结果七.设计心得错误!未定义书签。八.参考文献23.课程设计目的及要求深入了解文件管理系统,初步掌握文件管理系统的实现方法。用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各 种文件操作命令的实质内容和执行过程有比较深入的了解。编写一程序,模拟一个简单的文件管理系统。树型结构,目录下可以是目录,也可以是 文件。cd 目录名 dir 目录名 md 目录名 rd 目录名 edit 文件名 del 文件名 exit在此文件管理系统,可实现的操作有:格式 格式 格式 格式改变目录:

2、格式 显示目录:格式创建目录:删除目录:新建文件:退出文件系统:删除文件:相关知识1. 文件结构体struct FileNodechar filenameFILENAME_LEN;/ 文件名 /目录名int isdir;/目录文件识别标志int i_nlink;/文件的链接数int adr;/文件的地址struct FileNode *p are nt, *child;/指向父亲的指针和指向左孩子的指针struct FileNode *sibli ng_prev, *sibli ng_next;/ 指向前一个兄弟的指针和指向后一个兄弟的指针.""整个文件系统采用二叉树型存储

3、结构,初始化文件树如下:nuEr1 1Ar1 1 1/ I1etcXux«rbinA 1 *1 I -1 12 1fti1 1*1 1 4=1 1图2-1初始目录树2. 所使用函数及其功能int Mai n(); / 主函数void Init();/初始化文件树int ParseComma nd();/接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();/执行命令,分别执行 cd,edit,md,del,rd, dir,exit 命令 in t cdComd(); /改变目录功能处理int editComd();/处理edit命令,即创建文件,只要

4、创建表示文件的节点即可,内容及大 小不考虑int mdComd(); / 创建目录int delComd();/处理del命令,即删除指定文件,不存在是给出错误信息int dirComd();/处理dir命令,显示目录in t rdComd(); / 删除目录int Fin dFile name(char P ara2);/查找文件名struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink);/ 创建结点int GetI npu t(char* buffer,u nsig ned int buffer_le n);/

5、 获取输入3. 所使用的变量struct FileNode *cp, *tp, *root;/ *cp, *tp, *root 是根目录节点char pathINPUT_LEN-COMMAND_LEN;/ 记录当前走过的路径char P ara1COMMAND_LEN, Para2IN PUT_LEN-COMMAND_LEN;/para1数组存储输入的命令, para2数组存储输入的文件名char file nameFILENAME_LEN,t mp;un sig ned int i,j;题目分析1.文件系统采用二叉树型存储结构,结点结构如下:struct FileNodechar filen

6、ameFILENAME_LEN;/ 文件名 / 目录名int isdir;/int i_nli nk;/int adr;/目录、文件的识别标志(0为文件,1为目录) 文件的链接数文件的地址指向父亲的指针和指向左孩子的指针*sibli ng_next;/指向前一个兄弟的指针和指向struct FileNode *p are nt, *child;/struct FileNode *sibling_prev,后一个兄弟的指针.;2目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开3. 功能具体描述:改变目录:改变当前工作目录,目录不存在时给出出错信息显示目录:显示指定目录下或当前目

7、录下所有文件和一级目录(选做:带/s参数的dir命令,显示所有子目录)创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删 除。创建文件:创建指定名字的文件,只要创建表示文件的节点即可,内容及大小不考虑。 删除文件:删除指定文件,不存在时给出出错信息。退出文件系统:exit4、总体流程:初始化文件目录;输出提示符,等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入 EXIT退出为止。四.概要设计1 .在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实

8、现一个简单的单用户文 件系统。2 .文件存储空间的分配采用显式链接分配。为了实现创建和删除文件必须要有一棵初 始的文件树存在,以便在文件树的根节点下实现创建和删除文件。3.数据结构与树结构。数据结构是计算机存储、组织数据的方式。数据结构是指相 互之间存在一种或多种特定关系的数据元素的集合。树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支 关系组织起来的结构,很象自然界中的树那样。树中每个分叉点称为结点,起始结点称 为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。结点的 前趋结点称为该结点的"双亲",结点的后趋结点称为该结点的

9、"孩子",同一结点的"孩子" 之间互称"兄弟"。4 .文件目录结构采用多级目录结构。为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄 弟指5. 要有分解函数对输入的命令进行分解。以识别那部分是哪部分是命令,哪部分是路 径和文件名。6.最后要有执行函数。来执行输入的创建文件命令。五.代码及流程图5-1主函数流程图2)edit()创建文件函数流程图图5-3删除函数流程图4) ParseCommand(分解命令函数流程图5)改变目录函数rdComdOr曲* ,丙s鏡* &

10、#171;鼻±叭IB if计桑特亨藝,:J At *«0由重丘柑a 图5-5改变目录函数流程图源代码:#in clude <stdio.h>#i nclude <iostream>#in clude <stri ng.h>#in clude <ct yp e.h>#in clude <stdlib.h>#defi ne FILENAME_LEN 21#defi ne INPU T_LEN 81#define COMMAND LEN 11 using n ames pace std;void Init();/初始化文

11、件树int P arseComma nd();/接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();/ 执行命令int cdComd();/ 处理 cd 命令int editComd();/ 处理 edit 命令int delComdO;/ 处理 del 命令int dirComd();/ 处理 dir 命令int mdComd();/ 处理 md 命令int rdComdO;/ 处理 rd 命令int FindPath(char *ph);/寻找参数 ph所指向的路径int FindFilename(char Para2);/从参数Para2中找到要建立或

12、删除的文件、目录名,并把指针只想其 父亲结点struct FileNode* CreateFileNode(char file name,i nt isdir,i nt i_n li nk);/创建结点int GetI np ut(char* buffer,u nsig ned int buffer_le n);/ 获取输入int CheckCommand();/ 命令检查int GetDir(i nt begi n, char *p ath,char *curDir);/ 获取路径struct FileNode *cp, *t p, *root;char pathIN PU T_LEN-CO

13、MMAND_LEN;/记录当前走过的路径char P ara1COMMAND_LEN, Para2IN PU T_LEN-COMMAND_LEN;char curpathI NPU T_LEN-COMMAND_LEN,tm pp athI NPU T_LEN-COMMAND_LEN;char file nameFILENAME_LEN,t mp;un sig ned int i,j;/i nt i,j;struct FileNode / 结点结构char filenameFILENAME_LEN;/文件名 /目录名int isdir;/目录文件识别标志int i_nlink;/文件的链接数st

14、ruct FileNode *parent, *child;/指向父亲的指针和指向左孩子的指针struct FileNode *sibli ng_p rev, *sibli ng_n ext;/ 指向前一个兄弟的指针和指向后一个兄弟的指针 ;/创建结点struct FileNode* CreateFileNode(char file name,i nt isdir,i nt i_n li nk)struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode);/ 申请结点空间/相应内容赋初值strc py(no de-

15、>file name,file name);no de->isdir=isdir;no de->i_ nii nk=i_ nii nk;no de->paren t=NULL;n ode->child=NULL;no de->sibli ng_p rev=NULL;no de->sibli ng_n ext=NULL;retur n no de;/初始化文件树void Ini t() struct FileNode *bi nN ode,*usrNode, *un ixNode,*etcNode,*libNode,*userNode, *bi nN o

16、de2,*liuNode,*su nN ode,*ftiNode;strcpy(path,"/"); /根目录写入当前路径/创建文件树的结点bi nN ode=CreateFileNode("bi n",1,0); usrNode=CreateFileNode("usr",1,0);un ixNode=CreateFileNode("u ni x",0,0); etcNode=CreateFileNode("etc",1,0); libNode=CreateFileNode("lib&

17、quot;,1,0); userNode=CreateFileNode("user",1,0);bi nN ode2=CreateFileNode("bi n",1,0); liuNode=CreateFileNode("liu",1,0);su nN ode=CreateFileNode("su n",1,0); ftiNode=CreateFileNode("fti",1,0);cp=tp=root=CreateFileNode("/",1,0);/结点相应内容赋值roo

18、t- >paren t=NULL; root->child=b inN ode;root->sibli ng_p rev=root->sibli ng_n ext=NULL;binN ode->paren t=root;binN ode->child=NULL;binN ode->sibli ng_p rev=NULL; bi nN ode->sibli ng_n ext=usrNode;usrNode->paren t=NULL; usrNode->child=libNode; usrNode->sibli ng_p rev=

19、b inN ode; usrNode->sibli ng_n ext=uni xNode;uni xNode->paren t=NULL;un ixNode->child=NULL;un ixNode->sibli ng_p rev=usrNode; uni xNode->sibli ng_n ext=etcNode;etcNode-> paren t=NULL; etcNode->child=NULL; etcNode->sibli ng_p rev= uni xNode; etcNode->sibli ng_next=NULL;libN

20、ode->paren t=usrNode; libNode->child=liuNode; libNode->sibli ng_prev=NULL; libNode->sibli ng_n ext=userNode;userNode->paren t=NULL; userNode->child=NULL; userNode->sibli ng_p rev=libNode; userNode->sibli ng_n ext=b inN ode2;binN ode2-> pare nt=NULL;binN ode2->child=NULL

21、;binN ode2->sibli ng_p rev=userNode;binN ode2->sibli ng_n ext=NULL;liuNode->paren t=libNode; liuNode->child=NULL; liuNode->sibli ng_prev=NULL; liuNode->sibli ng_n ext=s unN ode;sunN ode->paren t=NULL;sunN ode->child=NULL;sunN ode->sibli ng_p rev=liuNode;sunN ode->sibli

22、ng_n ext=ftiNode;ftiNode-> pare nt=NULL; ftiNode->child=NULL; ftiNode->sibli ng_p rev=s unN ode; ftiNode->sibli ng_n ext=NULL;获取文件或目录名,并把指针指向其父亲结点int Fin dFile name(char P ara2)i=strle n(P ara2)-1;j=0;while (P ara2i!=7'&& i>=0)file namej=P ara2i;i-; j+;file namej='0

23、9;/获得逆序的文件或目录名,存入 file name中 if(i<0) Para2i+1='0'else Para2i='0'j-;/filename逆转,获得正确的文件或目录名for(i=0;i<strle n( file name)/2;i+,j-) tmp=file namei;file namei=file namej;file namej=t mp;if(strle n(P ara2)>0) 查找路径int sig n=Fi ndP ath (P ara2);if(sig n=0)return 0; return 1;/缓冲区安全输

24、入子函数buffer_le n-1长度的输入,/如果输入超过buffer_len,则截取前 /buffer_len处字符用70'代替 int GetI npu t(char* buffer,u nsig ned int buffer_le n) un sig ned int coun t=0;while(co un t<buffer_le n) if(buffercou nt=getchar()=10) buffercou nt='0'retur n count;coun t+; while(getchar()!=10);bufferbuffer_le n-1=&

25、#39;0' return -1;II改变目录函数int cdComd() if(!CheckCommand() / 命令检查return 0;if(strcmp(Para2,".")=0) 对 cd.命令的处理int i;while(c p->sibli ng_prev) cp=cp->sibli ng_p rev;if(cp->parent) cp=cp->parent; /找到父亲结点 else return 0; /对当前路径进行相应处理i=strle n(p ath);while( pathi!=7'&&i

26、>0) i-;if(i!=0) pathi='0'elsep athi+1='0'else FindP ath( Para2);/ 查找路径 return 1;/创建目录函数int mdComd() struct FileNode * temp ,*t p;tem p=CreateFileNode("",1,0);int sig n;if(strle n(P ara2)=0) / 参数不能为空printf("n命令格式有错误.n");return 0;if(strle n(P ara2)>20) 长度检查pri

27、ntf("n目录名过长rr); return 0;/格式检查if (!(isal pha( Para20)| Para20='_'| Para20='0'| Para20=7')printf(”目录名格式有错!n”);/*目录首字母可以为字母'或数字或'/'*/ return 0;sig n=Fin dFile name (P ara2);/获取目录名if(sig n=0)return 0;if(c p->isdir!=1) /如当前指针指向的是文件,则报错prin tf("you cannot edit

28、 a directory in un der a file!n"); return 0;tp=CreateFileNode(file name,1,0);/创建目录结点,并插入到指定目录下if(c p->child=NULL)tp->paren t=c p;tp->child=NULL;cp->child=t p;tp->sibli ng_p rev=NULL;tp->sibli ng_n ext=NULL;else temp=cp;/用temp找到新结点插入处temp=te mp->child;while(te mp->sibli n

29、g_n ext ) /find the last sib ing nodetemp=temp->sibli ng_n ext;if(strcm p(temp->file name,file name)=0&&temp->isdir=1) printf("此目录名已存在n");/重名报错 return 0;/找到了最后一个结点temp->sibli ng_n ext=t p;tp-> paren t=NULL;tp->child=NULL;tp->sibli ng_p rev=te mp;tp->sibli ng

30、_n ext=NULL;return 1;删除目录函数int rdComd() int sig n;struct FileNode *te mp;char cmd2;if(!CheckCommand() / 命令检查return 0;sign=FindFilename(Para2); / 获取目录名if(sig n=0) return 0;if(cp->child) /用temp指向要删除的结点temp=cp->child;while(te mp->sibli ng_n ext && (strc mp (te mp->file name,file nam

31、e)!=0 | temp->isdir!=1) temp=temp->sibli ng_n ext;if(strc mp (te mp->file name,file name)!=0) printf("不存在该目录!n");return 0;else printf(”不存在该目录!n"); return 0;if(temp->isdir!=1) prin tf("ERROR!return 0;if(tem p->child)/要删除的不能是文件 该命令只能删除目录,不可删除文件!n");/如仍有用户使用该目录,则

32、不能删除Y/N!n");printf("n该目录不为空,您确定要删除吗?GetI np ut(cmd,2);if(strc mp (cmd," rr)=O|strc mp (cmd,"N")=O) return 0;删除工作if(te mp-> pare nt=NULL) /不是第一个孩子temp->sibli ng_p rev->sibli ng_n ext=te mp->sibli ng_n ext;if(temp->sibling_next)/处理是最后一个兄弟的情况 temp->sibli ng_n

33、ext->sibli ng_p rev=te mp->sibli ng_prev; temp->sibli ng_p rev=te mp->sibli ng_n ext=NULL;/ifelse /第一个孩子if(temp->sibling_next)/处理是最后一个兄弟的情况 temp->sibli ng_n ext- >paren t=te mp->parent; temp->paren t->child=te mp->sibli ng_n ext;free(te mp); return 1;显示目录子函数int dirCo

34、md() if(strlen(Para2)>0) int sign=FindPath(Para2); / 查找路径if(sig n=0) return 0; elseprin tf("n%s>", p ath);if(cp !=root)prin tf("<DIR>if(cp->child=NULL) / 指定目录为空 return 0;tp=cp;tp=tp->child;/指定目录不为空,显示其所有子目录及文件名while(t P)%sn",".");if(t p->isdir) prin

35、tf(”elseprintf(”<DIR><FILE>%sn ”,t p->file name);%sn ”,t p->file name);tp=tp->sibli ng_n ext; return 0;创建文件函数int editComdO struct FileNode * tem p=CreateFileNode("",0,0);int sig n;struct FileNode *tp;if(strle n(P ara2)=0) / 路径不能为空printf("n命令格式有错误.n");return 0

36、;if(strle n(P ara2)>20) 长度检查printf("n文件名过长rr);return 0;/格式检查if (!(isal pha( Para20)| Para20='_'| Para20='0'| Para20=7')printf(”文件名格式有错!n”);/*文件首字母可以为字母'或数字或'_'或7'或回车'*/ return 0;sign=FindFilename(Para2);/ 获取文件名if(sig n=0)return 0;if(cp->isdir!=1) 如当

37、前指针指向的是文件,则报错prin tf("you cannot edit a file in un der a file!n"); return 0;/创建文件结点,并插入到指定目录下tp=CreateFileNode("",1,0);strc py(tp->file name,file name);tp->isdir=0;tp->i_n li nk=0;if(c p->child=NULL) tp->paren t=c p;tp->child=NULL;cp->child=t p;tp->sibli n

38、g_p rev=NULL;tp->sibli ng_n ext=NULL;else temp=cp;temp=temp->child;/用temp找到新结点插入处while(te mp->sibli ng_n ext ) /find the last sib ing nodetemp=temp->sibli ng_n ext;if(strcm p(te mp->file name,file name)=0&&temp->isdir=O) printf(”此文件名已存在,请重新输入n"); /重名报错 return 0;/找到了最后一

39、个结点temp->sibli ng_n ext=t p;tp-> paren t=NULL;tp->child=NULL;tp->sibli ng_p rev=te mp;tp->sibli ng_n ext=NULL;return 1;删除文件子函数int delComd() int sig n;struct FileNode *te mp;if(strle n(P ara2)=0) / 参数不能为空printf("n命令格式有错误.n");return 0;sig n=Fi ndFile name( Para2);获取文件名if(sig n

40、=0) return 0;if(cp->child) /用temp指向要删除的结点temp=cp->child;while(te mp->sibli ng_n ext&&(strcm p(temp->file name,file name)!=0|te mp->isdir!=0) temp=temp->sibli ng_n ext;if(strc mp (te mp->file name,file name)!=0) printf("不存在该文件!n");return 0;else printf(”不存在该文件!n&

41、quot;);return 0;if(te mp->isdir!=0) 要删除的不能是目录printf("ERROR!该命令只能删除文件,不可删除目录!n");return 0;if(tem p->i_nli nk!=0) /如仍有用户使用该文件,则不能删除printf(”还有用户共享了该文件,不能删除!n");return 0;删除工作if(te mp-> pare nt=NULL) /不是第一个孩子temp->sibli ng_p rev->sibli ng_n ext=te mp->sibli ng_n ext; if(t

42、emp->sibling_next)/处理是最后一个兄弟的情况temp->sibli ng_n ext->sibli ng_p rev=te mp->sibli ng_prev; temp->sibli ng_p rev=te mp->sibli ng_n ext=NULL;else /第一个孩子if(temp->sibling_next)/处理是最后一个兄弟的情况 temp->sibli ng_n ext- >paren t=te mp->parent; temp->paren t->child=te mp->si

43、bli ng_n ext;free(te mp); return 1;获取当前目录名子函数int GetDir(i nt begi n, char *p ath,char *curDir) int i=0;int len=strle n(p ath);while(!( pathbegi n='')|( pathbegi n=7') &&beg i* le n) curDiri+=p athbeg in+;curDiri='0'retur n begi n+1;/查找路径函数int FindP ath(char *ph) struct Fi

44、leNode *tem p; /struct FileNode *tp ,*te mp; char old pathIN PU T_LEN-COMMAND_LEN;un sig ned int i=0; /int i=0int sig n=1;/ph是根目录if(strcm p(p h,"/")=0) cp=root; strc py( path,"/"); return 1;temp=cp;strcpy(oldpath,path);/保留原路径和指针if(p h0=7')/指针指向根目录的左孩子cp=root->child;i+; / 滤

45、过'/'strc py( path,"/");else if(cp!=NULL&&cp!=root)strcat (p ath,"/");if(cp&&cp->child) if(cp->isdir)cp=cp->child;/指针指向当前目录的左孩子else printf(” 路径错误!n");return 0;while(i<=strle n(p h)&&cp) /继续查找指定路径,如遇到文件则报错int j=0;if(p hi=7'&&

46、amp;cp->child) i+; / 略过'/'if(cp->isdir)cp=cp->child; /继续查找下级目录else printf(” 路径错误!n");return 0;strcat (p ath,"/");while( phi!=7'&&i <=strle n(p h) / curpath记录当前要找的路径名curp athj=p hi;i+; j+;curpathj='0'while(strc mp(cp->file name,cur path)!=0|(c

47、 p->isdir!=1) )&&cp->sibli ng_n ext!=NULL) cp=cp->sibli ng_n ext; if(strc mp(cp->file name,cur path)=0)if(cp->isdir=0) strc py(p ath,old path);cp=temp;printf(”是文件不是目录.n");return 0;strcat (p ath,c p->file name);if(strc mp(cp->file name,cur path)!=O|c p=NULL) strc py(

48、p ath,old path);cp=temp;printf("输入路径错误n");return 0;return 1;/命令检查函数int CheckComma nd() if(strle n(P ara2)=0) printf(”命令语法不正确.n"); return 0;return 1;分解命令子函数int P arseComma nd() char Inpu tsIN PU T_LEN;int i=0,j=0,ch;un sig ned int k=0;prin tf("%s>", path);if(Get Inp ut(l n

49、pu ts,IN PU T_LEN)=-1) 获取输入printf(”输入行太长.n");return 0;P ara10=Para20='0'获取参数Para1,即操作名while(I npu tsi!=' '&&lnp utsi!='0'&&i <COMMAND_LEN-1) P ara1i=I np utsi;i+;P ara1i='0'if(i=(COMMAND_LEN-1) return 1;/ 输入命令太长if(Inputsi!='0') II获取参数2,

50、即路径文件名while(I np utsi=' '&&i<INPU T_LEN-1) i+; j=0; while(I npu tsi!='0'&&i<INPU T_LEN-1) Para2j=I npu tsi;i+; j+;Para2j='0'for(k=0;k<strle n(P ara1);k+)将操作名全部转换成小写字母ch=tolower(i nt)P ara1k);Para1k=ch;return 1;/执行命令函数void ExecuteComma nd() int sig n;根

51、据参数Para1调用相应的功能处理模块if(strc mp(P ara1,"cd")=0)sign=cdComd(); /cd 命令else if(strcm p(P ara1,"edit")=0)sign=editComd();/edit 命令else if(strcm p(P ara1,"md")=0)sig n=mdComd(); /else if(strcm p(P ara1,"del")=0)sign=delComd();/del 命令else if(strcm p(P ara1,"rd&quo

52、t;)=0)sig n=rdComd();else if(strc mp(P ara1,"dir")=0)sign=dirComd();/dir 命令/exit命令else if(strcm p(P ara1,"exit")=0)exit(0);elseprintf(”命令错误,请重试n"); /命令输入不正确,报错int mai n() Init(); II初始化文件树whileif(P arseComma nd()分解命令ExecuteComma nd();/ 执行命令 return 0;六.运行结果1显示根目录下所有文件和目录I E:0Sa300205Debug1sjtX 文畔管瑾套

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论