《文件管理系统C++》由会员分享,可在线阅读,更多相关《文件管理系统C++(18页珍藏版)》请在金锄头文库上搜索。
1、目录目录一课程设计目的及要求 1二相关知识 2三. 题目分析 2四概要设计 3五代码及流程 4六运行结果 17七设计心得错误错误! !未定义书签。未定义书签。八参考文献 18一课程设计目的及要求一课程设计目的及要求深入了解文件管理系统,初步掌握文件管理系统的实现方法。用高级语言编写和调试一个简单的文件系统 ,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。编写一程序,模拟一个简单的文件管理系统。树型结构,目录下可以是目录,也可以是文件。在此文件管理系统,可实现的操作有:改变目录:格式:cd 显示目录:格式:dir 创建目录:格式:md 删除目录:格式:rd
2、新建文件:格式:edit 删除文件:格式:del 退出文件系统:exit.二相关知识二相关知识1.文件结构体struct FileNodechar 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 dirComd;/处理 d
4、ir 命令,显示目录int rdComd; /删除目录int FindFilename;/查找文件名struct FileNode* CreateFileNode;/创建结点int GetInput;/获取输入3所使用的变量struct FileNode *cp, *tp, *root;/ *cp, *tp, *root 是根目录节点char pathINPUT_LEN-COMMAND_LEN;/记录当前走过的路径char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;/para1 数组存储输入的命令,para2 数组存储输入的文件名char file
5、nameFILENAME_LEN,tmp;unsigned int i,j;三三 题目分析题目分析1文件系统采用二叉树型存储结构,结点结构如下:struct FileNode2 / 18.char filenameFILENAME_LEN;/文件名/目录名int isdir;/目录、文件的识别标志0 为文件,1 为目录int i_nlink;/文件的链接数/int adr;/文件的地址struct FileNode *parent, *child;/指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;/指向前一个兄弟的指针和
6、指向后一个兄弟的指针.;2目录名和文件名支持全路径名和相对路径名,路径名各分量间用/隔开3功能具体描述:改变目录:改变当前工作目录,目录不存在时给出出错信息显示目录:显示指定目录下或当前目录下所有文件和一级目录选做:带 /s 参数的 dir命令,显示所有子目录创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。删除目录:删除指定目录下所有文件和子目录。要删目录不空时 ,要给出提示是否要删除。创建文件:创建指定名字的文件,只要创建表示文件的节点即可,内容及大小不考虑。删除文件:删除指定文件,不存在时给出出错信息。退出文件系统:exit4、总体流程:初始化文件目录;输出提示符,等待接受
7、命令,分析键入的命令;对合法的命令 ,执行相应的处理程序 ,否则输出错误信息 ,继续等待新命令 ,直到键入EXIT 退出为止。四概要设计四概要设计1在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。2文件存储空间的分配采用显式链接分配。为了实现创建和删除文件必须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件。3. 数据结构与树结构。数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。树是一种重要的非线性数据结构,直观地看,它是数据元素在树中称为结点按分支关系组织起来的结构,很象自然界中的树那样。树中
8、每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。 结点的前趋结点称为该结点的双亲,结点的后趋结点称为该结点的 孩子,同一结点的孩子之间互称兄弟。4文件目录结构采用多级目录结构。为了简单起见 ,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指5. 要有分解函数对输入的命令进行分解。 以识别那部分是哪部分是命令,哪部分是路径和文件名。6. 最后要有执行函数。来执行输入的创建文件命令。3 / 18.五代码及流程五代码及流程开始初始化文件树获取键盘输入分解命令执行命令创建目录/文件删除目录文
9、件显示目录退出改变目录图 5-1 主函数流程图2edit创建文件函数流程图图 5-2 创建文件函数流程图4 / 18.开始检查命令格式获取文件名不存在该文件删除的是目录由用户共享该文件处理删除的是第一个孩子情况处理删除的不是第一个孩子情况报错提示图 5-3删除函数流程图结束4ParseCommand分解命令函数流程图图 5-4 分解命令函数流程图5 改变目录函数 rdComd图 5-5 改变目录函数流程图源代码:#include #include #include #include #include #define FILENAME_LEN 21#define INPUT_LEN 81#def
10、ine COMMAND_LEN 11using namespace std;void Init;/初始化文件树int ParseCommand;/接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand;/执行命令int cdComd;/处理 cd 命令int editComd;/处理 edit 命令int delComd;/处理 del 命令int dirComd;/处理 dir 命令int mdComd;/处理 md 命令int rdComd;/处理 rd 命令int FindPath;/寻找参数 ph 所指向的路径int FindFilename;/从参数 Pa
11、ra2 中找到要建立或删除的文件、目录名,并把指针只想其5 / 18.父亲结点struct FileNode* CreateFileNode;/ 创建结点int GetInput;/获取输入int CheckCommand;/命令检查int GetDir;/获取路径struct FileNode *cp, *tp, *root;char pathINPUT_LEN-COMMAND_LEN;/记录当前走过的路径char Para1COMMAND_LEN,Para2INPUT_LEN-COMMAND_LEN;char curpathINPUT_LEN-COMMAND_LEN,tmppathINPU
12、T_LEN-COMMAND_LEN;char filenameFILENAME_LEN,tmp;unsigned int 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 Fil
13、eNode* CreateFileNodestruct FileNode* node=mallocsizeof;/申请结点空间/相应内容赋初值strcpyfilename,filename;node-isdir=isdir;node-i_nlink=i_nlink;node-parent=NULL;node-child=NULL;node-sibling_prev=NULL;node-sibling_next=NULL;return node;/初始化文件树void Init struct FileNode *binNode,*usrNode,*unixNode,*etcNode,*libNo
14、de,*userNode,*binNode2,*liuNode,*sunNode,*ftiNode;strcpy; /根目录写入当前路径/创建文件树的结点binNode=CreateFileNode;usrNode=CreateFileNode;unixNode=CreateFileNode;etcNode=CreateFileNode;libNode=CreateFileNode;userNode=CreateFileNode;6 / 18.binNode2=CreateFileNode;liuNode=CreateFileNode;sunNode=CreateFileNode;ftiNod
15、e=CreateFileNode;cp=tp=root=CreateFileNode;/结点相应内容赋值root-parent=NULL;root-child=binNode;root-sibling_prev=root-sibling_next=NULL;binNode-parent=root;binNode-child=NULL;binNode-sibling_prev=NULL;binNode-sibling_next=usrNode;usrNode-parent=NULL;usrNode-child=libNode;usrNode-sibling_prev=binNode;usrNod
16、e-sibling_next=unixNode;unixNode-parent=NULL;unixNode-child=NULL;unixNode-sibling_prev=usrNode;unixNode-sibling_next=etcNode;etcNode-parent=NULL;etcNode-child=NULL;etcNode-sibling_prev=unixNode;etcNode-sibling_next=NULL;libNode-parent=usrNode;libNode-child=liuNode;libNode-sibling_prev=NULL;libNode-s
17、ibling_next=userNode;userNode-parent=NULL;userNode-child=NULL;userNode-sibling_prev=libNode;userNode-sibling_next=binNode2;binNode2-parent=NULL;binNode2-child=NULL;binNode2-sibling_prev=userNode;binNode2-sibling_next=NULL;liuNode-parent=libNode;liuNode-child=NULL;liuNode-sibling_prev=NULL;liuNode-si
18、bling_next=sunNode;sunNode-parent=NULL;sunNode-child=NULL;sunNode-sibling_prev=liuNode;sunNode-sibling_next=ftiNode;7 / 18.ftiNode-parent=NULL;ftiNode-child=NULL;ftiNode-sibling_prev=sunNode;ftiNode-sibling_next=NULL;/获取文件或目录名,并把指针指向其父亲结点int FindFilenamei=strlen-1;j=0;while=0 filenamej=Para2i;i-; j+
19、;filenamej=0;/获得逆序的文件或目录名,存入 filename 中ifi Para2i+1=0;else Para2i=0;j-;fori=0;istrlen/2;i+,j- /filename 逆转,获得正确的文件或目录名tmp=filenamei;filenamei=filenamej;filenamej=tmp;ifstrlen0 /查找路径int sign=FindPath;ifreturn 0;return 1;/缓冲区安全输入子函数/如果输入超过 buffer_len,则截取前 buffer_len-1长度的输入,/buffer_len处字符用/0代替int GetIn
20、put unsigned int count=0;whilecountifbuffercount=getchar=10 buffercount=0;return count;count+;whilegetchar!=10;bufferbuffer_len-1=0;return -1;8 / 18./改变目录函数int cdComd if!CheckCommand /命令检查return 0;ifstrcmp=0 /对 cd.命令的处理int i;whilesibling_prevcp=cp-sibling_prev;ifparent cp=cp-parent; /找到父亲结点else retu
21、rn 0; /对当前路径进行相应处理i=strlen;while0 i-;ifpathi=0;elsepathi+1=0;else FindPath;/查找路径return 1;/创建目录函数int mdComd struct FileNode * temp,*tp;temp=CreateFileNode;int sign;ifstrlen=0 /参数不能为空printf;return 0;ifstrlen20 /长度检查printf;return 0;/格式检查if !isalpha|Para20=_|Para20=0|Para20=/printf;/* 目录首字母可以为字母或数字或/*/r
22、eturn 0;sign=FindFilename; /获取目录名if9 / 18.return 0;ifisdir!=1 /如当前指针指向的是文件,则报错printf;return 0;tp=CreateFileNode;/创建目录结点,并插入到指定目录下ifchild=NULL tp-parent=cp;tp-child=NULL;cp-child=tp;tp-sibling_prev=NULL;tp-sibling_next=NULL;else temp=cp;/用 temp 找到新结点插入处temp=temp-child;whilesibling_next /find the last
23、 sibing nodetemp=temp-sibling_next;ifstrcmpfilename,filename=0&temp-isdir=1 printf;/重名报错return 0;/找到了最后一个结点temp-sibling_next=tp;tp-parent=NULL;tp-child=NULL;tp-sibling_prev=temp;tp-sibling_next=NULL;return 1;/删除目录函数int rdComd int sign;struct FileNode *temp;char cmd2;if!CheckCommand /命令检查return 0;sig
24、n=FindFilename; /获取目录名if return 0;ifchild /用 temp 指向要删除的结点temp=cp-child;whilesibling_next & strcmpfilename,filename!=0 | temp-isdir!=1temp=temp-sibling_next;ifstrcmpfilename,filename!=0 10 / 18.printf;return 0;else printf;return 0;ifisdir!=1 /要删除的不能是文件printf;return 0;ifchild/如仍有用户使用该目录,则不能删除printf;G
25、etInput;ifstrcmp=0|strcmp=0return 0;/删除工作ifparent=NULL /不是第一个孩子temp-sibling_prev-sibling_next=temp-sibling_next;ifsibling_next/处理是最后一个兄弟的情况temp-sibling_next-sibling_prev=temp-sibling_prev;temp-sibling_prev=temp-sibling_next=NULL;/ifelse /第一个孩子ifsibling_next/处理是最后一个兄弟的情况temp-sibling_next-parent=temp-
26、parent;temp-parent-child=temp-sibling_next;free;return 1;/显示目录子函数int dirComd ifstrlen0int sign=FindPath; /查找路径ifreturn 0; elseprintf, path; ifprintf%sn,.;ifchild=NULL /指定目录为空return 0;11 / 18.tp=cp;tp=tp-child;/指定目录不为空,显示其所有子目录及文件名while ifisdirprintf%sn,tp-filename;elseprintf%sn,tp-filename;tp=tp-sib
27、ling_next;return 0;/创建文件函数int editComd struct FileNode * temp=CreateFileNode;int sign;struct FileNode *tp;ifstrlen=0 /路径不能为空printf;return 0;ifstrlen20 /长度检查printf;return 0;/格式检查if !isalpha|Para20=_|Para20=0|Para20=/printf;/* 文件首字母可以为字母或数字或_或/或回车*/return 0;sign=FindFilename;/获取文件名ifreturn 0;ifisdir!=
28、1 /如当前指针指向的是文件,则报错printf;return 0;/创建文件结点,并插入到指定目录下tp=CreateFileNode;strcpyfilename,filename;tp-isdir=0;tp-i_nlink=0;ifchild=NULL tp-parent=cp;tp-child=NULL;cp-child=tp;12 / 18.tp-sibling_prev=NULL;tp-sibling_next=NULL;else temp=cp;temp=temp-child;/用 temp 找到新结点插入处whilesibling_next /find the last sib
29、ing nodetemp=temp-sibling_next;ifstrcmpfilename,filename=0&temp-isdir=0 printf; /重名报错return 0;/找到了最后一个结点temp-sibling_next=tp;tp-parent=NULL;tp-child=NULL;tp-sibling_prev=temp;tp-sibling_next=NULL;return 1;/删除文件子函数int delComd int sign;struct FileNode *temp;ifstrlen=0 /参数不能为空printf;return 0;sign=FindF
30、ilename;/获取文件名if return 0;ifchild /用 temp 指向要删除的结点temp=cp-child;whilesibling_next&strcmpfilename,filename!=0|temp-isdir!=0temp=temp-sibling_next;ifstrcmpfilename,filename!=0 printf;return 0;else printf;return 0;ifisdir!=0 /要删除的不能是目录13 / 18.printf;return 0;ifi_nlink!=0 /如仍有用户使用该文件,则不能删除printf;return
31、0;/删除工作ifparent=NULL /不是第一个孩子temp-sibling_prev-sibling_next=temp-sibling_next;ifsibling_next/处理是最后一个兄弟的情况temp-sibling_next-sibling_prev=temp-sibling_prev;temp-sibling_prev=temp-sibling_next=NULL;else /第一个孩子ifsibling_next/处理是最后一个兄弟的情况temp-sibling_next-parent=temp-parent;temp-parent-child=temp-sibling
32、_next;free;return 1;/获取当前目录名子函数int GetDir int i=0;int len=strlen;while!|&begincurDiri+=pathbegin+;curDiri=0;return begin+1;/查找路径函数int FindPath struct FileNode *temp; /struct FileNode *tp,*temp;char oldpathINPUT_LEN-COMMAND_LEN;unsigned int i=0; /int i=0int sign=1;ifstrcmp=0 /ph 是根目录cp=root;strcpy;re
33、turn 1;temp=cp;strcpy;/保留原路径和指针if /指针指向根目录的左孩子14 / 18.cp=root-child;i+; /滤过/strcpy;else ifstrcat;ifchild ifisdircp=cp-child;/指针指向当前目录的左孩子else printf;return 0;whilei=strlen&cp /继续查找指定路径,如遇到文件则报错int j=0;ifchild i+; /略过/ifisdircp=cp-child; /继续查找下级目录elseprintf;return 0;strcat;whilephi!=/&i=strlen / curp
34、ath 记录当前要找的路径名curpathj=phi;i+; j+;curpathj=0;whilestrcmpfilename,curpath!=0|isdir!=1&cp-sibling_next!=NULLcp=cp-sibling_next;ifstrcmpfilename,curpath=0 ifisdir=0 strcpy;cp=temp;printf;return 0;strcatfilename;ifstrcmpfilename,curpath!=0|cp=NULL 15 / 18.strcpy;cp=temp;printf;return 0;return 1;/命令检查函数i
35、nt CheckCommand ifstrlen=0 printf;return 0;return 1;/分解命令子函数int ParseCommand char InputsINPUT_LEN;int i=0,j=0,ch;unsigned int k=0;printf,path;ifGetInput=-1 /获取输入printf;return 0;Para10=Para20=0;/获取参数 Para1,即操作名whileInputsi!= &Inputsi!=0&iPara1i=Inputsi;i+;Para1i=0;ifi= return 1;/输入命令太长if /获取参数 2,即路径文
36、件名whileInputsi= &i i+; j=0;whileInputsi!=0&i Para2j=Inputsi;i+; j+;Para2j=0;fork=0;kstrlen;k+/将操作名全部转换成小写字母ch=tolowerPara1k;Para1k=ch;16 / 18.return 1;/执行命令函数void ExecuteCommand int sign;/根据参数 Para1 调用相应的功能处理模块ifstrcmp=0sign=cdComd;/cd 命令else ifstrcmp=0sign=editComd;/edit 命令else ifstrcmp=0sign=mdCom
37、d;/else ifstrcmp=0sign=delComd;/del 命令else ifstrcmp=0sign=rdComd;else ifstrcmp=0sign=dirComd;/dir 命令else ifstrcmp=0exit;/exit 命令elseprintf;/命令输入不正确,报错int main Init; /初始化文件树while ifParseCommand/分解命令ExecuteCommand;/执行命令return 0;六运行结果六运行结果1显示根目录下所有文件和目录图 6-1 当前根目录下目录和文件2创建目录和文件图 6-2 创建目录和文件3删除目录和文件图 6-3 删除目录和文件4创建文件重名情况图 6-4 创建文件重名的情况5改变目录17 / 18.图 6-5 改变目录6退出系统图 6-6 退出文件系统八参考文献八参考文献1 操作系统. 宗大华 宗涛 陈吉人 编著.北京:人民邮电出版社,2009.2 数据结构. 严蔚敏 吴伟民 编著.北京:清华大学出版社,2006.3 C 语言程序设计. 马秀丽 刘志妩 李筠 编著.北京:清华大学出版社,2008.18 / 18