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

下载本文档

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

文档简介

目录

一.课程设计目的1

二.课程设计要求1

三.设计思想及流程2

四.数据结构3

五.详细设计4

六.程序源代码5

七.运行结果17

八.课程设计心得17

九.参考文献18

一.课程设计目的

深入了解文件管理系统,初步掌握文件管理系统的实现方法。

用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种

文件操作命令的实质内容和执行过程有比拟深入的了解。

二.课程设计要求

编写一程序,模拟一个简单的文件管理系统。树型结构,目录下可以是目录,也可以是文

件。

在此文件管理系统,可实现的操作有:

改变目录:格式:cd〈目录名)

显示目录:格式:dir〈目录名〉

创立目录:格式:md〈目录名)

删除目录:格式:rd〈目录名)

新建文件:格式:edit<文件名)

删除文件:格式:del〈文件名)

退出文件系统:exit

1.文件系统采用二叉树型存储结构,结点结构如下:

structFileNode

charfilename[FILENAME_LEN];〃文件名/目录名

intisdir;〃目录、文件的识别标志(0为文件,1为目录)

inti_nlink;〃文件的链接数

//intadr;〃文件的地址

structFileNode*parent,*chiId;//指向父亲的指针和指向左孩子的指计

structFileNode*sibling_prcv,*siblingncxt;〃指向前一个兄弟的指针和指向后

一个兄弟的指针.

};

2.目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开

3.功能具体描述:

改变目录:改变当前工作目录,目录不存在时给出出错信息

显示目录:显示指定目录下或当前目录下所有文件和一级目录(选做:带/s参数的dir命

令,显示所有子目录)

创立目录:在指定路径或当前路径下创立指定日录。重名时给出错信息。

删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。

创立文件:创立指定名字的文件,只要创立表示文件的节点即可,内容及大小不考虑。

删除文件:删除指定文件,不存在时给出出错信息。

退出文件系统:exit

4、总体流程:

初始化文件目录;

输出提示符,等待接受命令,分析键入的命令;

对合法的命令,执行相应的处理程序,否那么输出错误信息,继续等待新命令,直到键入

EXIT退出为止。

三.设计思想及流程

1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系

统。

2.文件存储空间的分配采用显式链接分配。为了实现创立和删除文件必须要有一棵初始的

文件树存在,以便在文件树的根节点下实现创立和删除文件。

3.数据结构与树结构。数据结构是计算机存储、组织数据的方式。数据结构是指相互

之间存在一种或多种特定关系的数据元素的集合。

树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关

系组织起来的结构,很象自然界中的树那样。树中每个分叉点称为结点,起始结点称为树

根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。结点的前趋结

点称为该结点的“双亲”,结点的后趋结点称为该结点的“孩子”,同一结点的“孩子"之间互称”

兄弟二

4.文件目录结构采用多级目录结构。为了简单起见,可以使用文件结构体,结构体内容包

括:文件名,文件口录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指

5.要有分解函数对输入的命令进行分解。以识别那局部是哪局部是命令,哪局部是路径和

文件名。

6.最后要有执行函数。来执行输入的创立文件命令。

四.数据结构

L文件结构体

structFileNode

{

charfilename[FILENAME_LEN];〃文件名/目录名

intisdir;〃目录文件识别标志

inti_nlink;〃文件的链接数

intadr;〃文件的地址

structFileNode*parenl,*child;〃指向父亲的指针和指向左孩子的指针

structFileNode*sibling_prev,*sibling_next;〃指向前一个兄弟的指针和指向

〃后一个兄弟的指针.

):

整个文件系统采用二叉树型存储结构,初始化文件树如下:

图4-1初始目录树

2.所使用函数及其功能

intMain();〃主函数

voidInit();〃初始化文件树

intParseCommand();〃接受输入的命令并把其多解成操作名和路径文件名

voidExecuteCommand。;//执行命令,分别执行cd,edit,md,del,rd,dir,exit命令

intcdComd();〃改变目录功能处理

inteditComd();〃处理edit命令,即创立文件,只要创立表示文件的节点即可,内容及大小

不考虑

intmdComd。;//创立目录

intdelComd。;//处理del命令,即删除指定文件,不存在是给出错误信息

inldirComd();〃处理dir命令,显示目录

intrdComd。;〃删除目录

intFindFilename(charPara2[]);〃查找文件名

structFileNode*CreateFilcNodc(charfilenamc[J,intisdir,inti_nlink);〃创立结点

intGetlnput(char*buffer,unsignedintbuffer」en);〃获取输入

3.所使用的变量

structFileNode*cp,*tp,*roo(;//*cp,*tp,*root是根目录节点

charpath[INPUT_LEN-COMMAND_LEN];〃记录当前走过的路径

charParal[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];//paral数组存储输入

的命令,para2数组存储输入的文件名

charfilcnamc[FILENAME_LEN],tnip;

unsignedinti,j;

开始

图5-3删除函数流程图

4)ParseCommand()分解命令函数流程图

图5-4分解命令函数流程图

六.程序源代码

#include<stdio.h>

#include<iostream>

#include<string.h>

#include<ctype.h>

#include<stdlib.h>

#dcfincFILENAME_LEN21

#defineINPUT_LEN81

#defineCOMMAND.LEN11

usingnamespacestd;

void初始化文件树

intParseCommand。,接受输入的命令并把其分解成操作名和路径文件名

voidExecuteCommand();〃执行命令

intcdComd();〃处理cd命令

intedilComd();〃处理edit命令

intdelComd();〃处理del命令

intdirComd。;〃处理dir命令

intmdComd();〃处理md命令

intrdComd。;〃处理rd命令

intFindPath(char小ph);〃寻找参数ph所指向的路径

intFindFilcnamc(charPara2口);〃从参数Para2中找到要建立或删除的文件、目录名,并把指针只想其父亲

结点

structFilcNodc*CrcatcFilcNodc(charfilcnamc[],intisdir,inti_nlink);〃创立结点

intGellnpul(char*buffer,unsignedin(buffer」en);〃获取输入

intCheckCommand。;〃命令检查

intGetDir(intbegin,char*path,char*curDir);〃获取路径

structFileNode*cp,*tp,*root;

charpalh[INPUT_LEN-COMMAND_LEN];〃记录当前走过的路径

charParalfCOMMAND_LENLP<ira2[INPUT_LEN-COMMAND_LENl;

charcurpathlINPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LENJ;

charfiIcnamc[FILENAME_LEN],(mp;

unsignedinti,j;//inti,j;

structFileNode〃结点结构

{

charfilename[FILENAME_LEN];〃文件名/目录名

in(isdir;〃目录文件识别标志

inti」Wnk;〃文件的链接数

structFileNode*parent,*chikl;〃指向父亲的指针和指向左孩子的指针

structFileNode*sibling_prev,*sibling_next;〃指向前一,个兄弟的指针和指向后一个兄弟的指针.

);

〃创立结点

structFileNode*CreateFileNode(charfilename[J,intisdir,inti_nlink){

structFileNode*node=(structFileNode*)malloc(sizeof(structFileNode));//申请结点空间

〃相应内容赋初值

strcpy(node->filename,filename);

node->isdir=isdir;

node->i_nlink=i_nlink;

node->parent=NULL;

node->child=NULL;

node->sibling_prev=NULL;

node->sibling_ncxt=NULL;

returnnode;

)

〃初始化文件树

voidInit(){

structFileNode*binNode,*usrNode,

*unixNode,*etcNode,*libNode,*userNode,

*binNodc2,*liuNode,*sunNodc,*ftiNodc;

strcpy(path;7");〃根目录写入当前路径

〃创立文件树的结点

binNode=CreateFileNode(,'bin,',1,0);

usrNode=CreateFileNode("usr,,,1,0);

unixNode=CreateFileNode("unix'\0,0);

etcNode=CreateFileNode("etc",1,0);

!ibNodc=CreatcFilcNodc("lib",1,0);

userNode=CreateFileNode("user",1,0);

binNode2=CreateFileNode("bin"J,0);

liuNode=CreateFileNode("liu",1.0);

sunNodc=CreatcFilcNodc("sun,,,l,0);

ftiNode=CreateFileNode("ftir,1,0);

cp=tp=root=CreateFileNode('7",1,0);

〃结点相应内容赋值

root->parent=NULL;

root->child=binNode;

root->sibling_prev=root->sibling_next=NULL;

binNode->parcnt=root;

binNodc->child=NULL;

binNode->sibling_prev=NULL;

binNode->sibling_next=usrNode;

usrNode->parent=NULL;

usrNode->child=libNode;

usrNode->sibling_prev=binNode;

usrNodc->sibling_ncxt=unixNode;

unixNode->parent=NULL;

unixNode->child=NULL;

unixNode->sibling_prev=usrNode;

unixNode->sibling_next=etcNode;

etcNode->parent=NULL;

etcNode->child=NULL;

ctcNodc->sibling_prcv=unixNode;

etcNode->sibling_next=NULL;

libNodc->parcnt=usrNodc;

libNode->child=liuNode:

libNode->sibling_prev=NULL:

IibNode->sibling_next=userNode;

userNode->parent=NULL;

uscrNodc->child=NULL;

userNode->sibling_prev=libNode;

userNode->sibling_next=binNode2;

binNode2->parent=NULL;

binNode2->child=NULL;

binNode2->sibling_prev=userNode;

binNode2->sibling_next=NULL;

liuNodc->parcnt=libNode;

liuNode->child=NULL;

liuNode->sibling_prev=NULL:

liuNode->sibling_next=sunNode;

sunNode->parent=NULL;

sunNode->child=NULL;

sunNode->sibling_prev=]iuN[)de;

sunNode->sibling_next=ftiNodc;

ftiNode->parent=NULL;

ftiNode->child=NULL;

ftiNode->sibling_prev=sunNode;

ftiNode->sibling_ncxt=NULL;

〃获取文件或目录名,并把指针指向其父亲结点

intFindFilename(charPara2[]){

i=strlen(Para2)-l;

j=0;

while(Para2[il!=7'&&i>=0){

filcnamc[j]=Para2li];

}

filenameljlCO'J/获得逆序的文件或目录名,存入filename中

if(i<0)Para2[i+l]='\O';

elsePara2[i]=>\0';

j~~»

for(i=0;i<strlcn(filcname)/2;i++,j-){//filename逆转,获得正确的文件或目录名

tmp=filename[i];

filenanic[i]=filcnamc[j];

filename[j]=unp;

}

if(strlen(Para2)>0){〃查找路径

intsign=FindPath(Para2);

if(sign==O)

return0;

)

returnI;

I

〃缓冲区平安输入子函数

〃如果输入超过buffejlen,那么截取前bufler」en-l长度的输入,

//bufferjen处字符用'/O'代替

intGetlnput(char*buffer,unsignedintbufferjen){

unsignedintcount=0;

while(count<buffer_len){

if((buffer[count]=getchar())==l0){

buffer[count]='\0';

returncount;

)

count++;

)

while(getchar()!=10);

buffer[buffer_ien-1]='\0';

return-1;

)

〃改变目录函数

intcdComdO{

if(!CheckCommand())〃命令检查

return0;

if(strcmp(Para2,"..")==0){〃对cd..命令的处理

inii;

while(cp->sibling_prev)

cp=cp->sibling_prev;

if(cp->parent)

{cp=cp->parent;}//找到父亲结点

else

{return0;}

〃对当前路径进行相应处理

i=strlen(path);

while(path[i]!=7'&&i>0)i-;

if(i!=0)

path[i]=\(y;

else

path[i+l]='\0';

}

else{

FindPaih(Para2)W查找路径

}

return1;

)

//创立目录函数

intmdComd(){

structFilcNodc*tcmp,*tp;

temp=CreateFiIeNode("",1,0);

intsign;

if(strlen(Para2)==0){〃参数小能为空

printf("\n命令格式有错误An”);

return0;

)

if(strlen(Para2)>20){〃长度检查

printf("\n目录名过长\n");

return0;

)

〃格式检查

if(!(isalpha(Para2[O])||Para2[D]==,_,l|Para2|O]==,\O,||Para2lO]==7,)){

printfC目录名格式有错八n");/*|=|录首字母可以为‘字母,或,数字,或,/'*/

return0;

I

sign=FindFilename(Para2);〃获取忖录名

if(sign==O)

return0;

if(cp->isdir!=l){〃如当前指针指向的是文件,那么报错

prinlf("youcannoteditadirectoryinunderafile!\n");

return0;

tp=CrcateFilcNodc(filcnamc,1,0);〃创立目录结点,并插入到指定目录下

if(cp->child==NULL){

tp->parent=cp;

tp->child=NULL;

cp->child=tp;

tp->sibling_prev=NULL;

tp->sibling_next=NULL;

)

else{

temp=cp;〃用temp找至lj新结点插入处

lemp=iemp->child;

while(temp->sibling_next){//findthelastsibingnode

tenip=temp->sibling_next;

if(strcmp(temp->filename,filename)==O&&temp->isdir==1){

printf("此目录名已存在\n");〃重名报错

retum0;

}

}〃找到了最后一个结点

temp->sibling_next=tp;

tp->parent=NULL;

tp->child=NULL;

tp->sibling_prcv=tcmp;

lp->sibling_next=NULL;

)

returnI;

I

〃删除目录函数

intrdComdO{

intsign;

structFileNode*lemp;

charcmd[2];

if(!CheckCommand())〃命令检查

return0;

sign=FindFilenanie(Para2);/废取目录名

if(sign==0)return0:

if(cp->child){〃用temp指向要删除的结点

temp=cp->child;

while(temp->sibling_next&&(strcmp(temp->filename,filename)!=0||temp->isdir!=l))

lemp=(emp->sibling_next;

if(strcmp(temp->filename,filename)!=O){

printf("不存在该目录!\n”);

return0;

else{

printf("不存在该目录!\n");

return0;

)

if(temp->isdir!=l){〃要删除的不能是文件

prinlf(”ERROR!该命令只能删除目录,不可删除文件!\n”);

return0;

)

if(temp->child){〃如仍有用户使用该目录,那么不能删除

printf("\n该目录不为空,您确定要删除吗?Y/N!\n");

Gctlnput(cmd,2);

if(strcmp(cmd,"n,,)==O||strcmp(cmd,,'N")==O)

return0;

}

〃删除工作

if(temp->parent==NULL){〃不是第一个孩子

temp->sibling_prcv->sibling_ncxt=tcmp->sibling_ncxt;

if(temp->sibling_next)〃处理是最后一个兄弟的情况

tcmp->sibling_ncxt->sibling_prcv=tcmp->sibling_prcv;

temp->sibling_prev=iemp->sibling_nexi=NULL;

}//if

else{〃第一个孩子

if(temp->sibling_nexl)〃处理是最后一个兄弟的情况

tcmp->sibling_ncxt->parcnt=tcmp->parcnt;

temp->parent->child=temp->sibling_next;

)

free(temp);

return1;

)

〃显示目录子函数

intdirComd(){

if(strlen(Para2)>0){

intsign二FindPath(Para2);〃查找路径

if(sign==O){return0;}

else

{printf("\n%s>'\path);}

}

if(cp!=root)

printfC<DIR>%s\n";'..");

if(cp->child==NULL)〃指定目录为空

{return0;}

tp=cp;

tp=tp->child;〃指定目录不为空,显示其所有子目录及文件名

while(tp){

if(tp->isdir)

printf(n<DIR>%s\n",tp->filename);

else

printf("<FILE>%s\n",tp->filename);

tp=tp->sibling_ncxt;

)

return0;

)

〃创立文件函数

inteditComd(){

structFileNode*temp=CreateFileNode("",0.0);

intsign;

structFileNode*tp;

if(strlen(Para2)==0){//路径不能为空

printf("\n命令格式有错误An");

return0;

)

if(strlen(Para2)>20){〃长度检查

printf("\n文件名过长\n");

return0;

)

〃格式检查

if(!(isaIpha(Para2[0])||Para2[0]==,_,||Para2[0]=='\0|||Para2[0]==7,)){

prinlf("文件名格式有错八n”);/*文件首字母可以为,字母,或,数字,或1或/或恒车为

return0;

)

sign=FindFilename(Para2);〃获取文件名

if(sign==0)

return0;

if(cp->isdir!=l){〃如当前指针指向的是文件,那么报错

printf("youcannoteditafileinunderafile!\n");

return0;

)

〃创立文件结点,并插入到指定目录下

tp=CreateFileNode("",1,0);

strcpy(tp->filename,filename);

tp->isdir=O;

tp->i_nlink=O;

if(cp->child==NULL){

tp->parcnt=cp;

(p->child=NULL;

cp->child=tp;

tp->sibling_prev=NULL;

tp->sibling_next=NULL;

)

else{

temp=cp;

temp=temp->child;//用temp找到新结点插入处

while(tenip->sibling_ncxt){//findthelastsibingnode

temp=temp->sibling_next;

if(strcinp(tcmp->fil3name,filcnainc)==0&&tcmp->isdir==0){

printfT此文件名已存在,请重新输入W);〃重名报错

return0;

}

}〃找到了最后一个结点

temp->sibling_next=tp;

tp->parent=NULL;

tp->child=NULL;

tp->sibling_prcv=tcmp;

tp->sibling_next=NULL;

I

return1;

)

〃刑除文件子函数

intdclComd(){

intsign;

structFilcNodc*tcmp;

if(sirlen(Para2)==O){〃参数不能为空

printf("\n命令格式有错误.\n”);

return0;

}

sign=FindFilcnamc(Para2);〃获取文件名

if(sign==O)return0;

if(cp->child){〃用temp指向要删除的结点

(emp=cp->child;

while(temp->sibling_next&&(strcmp(temp->filename,filename)!=O||temp->isdir!=O))

temp=temp->sibling_next;

if(strcmp(temp->filename,filename)!=O){

printf("不存在该文件不

return0;

I

)

else{

printf("不存在该文件!\n");

return0;

)

if(temp->isdir!=O){〃要删除的不能是1=1录

printf(”ERROR!该命令只能删除文件,不可删除目录!\n”);

return0;

}

if(temp->i_nlink!=O){〃如仍有用户使用该文件,那么不能删除

prinlf(”还有用户共享了该文件,不能删除!\n”);

return0;

〃删除工作

if(temp->parent==NULL){〃不是第一个孩子

tcmp->sibling_prcv->sibling_ncxt=tcmp->sibling_ncxt;

if((emp->sibling_next)//处理是最后一个兄弟的情况

temp->sibling_next->sibling_prev=temp->sibling_prev;

temp->sibling_prev=(emp->sibling_next=NULL;

}

else{〃第一个孩子

if(temp->sibling_next)〃处理是最后一个兄弟的情况

tcnip->sibling_ncxt->parent=tcmp->parent;

tcmp->parcnt->child=tcmp->sibling_ncxt;

}

free(iemp);

return1;

)

〃获取当前目录名子函数

intGctDir(intbegin,char*path,char*curDir){

in(i=0;

intlcn=strlcn(path);

while(!((path[begin]=='\V)||(path[begin]=-/'))&&begin<len)

{curDir[i++]=path[begin+-];}

curDirli]='\O';

returnbegin+1;

)

〃行找路径函数

intFindPath(char*ph){

structFileNode*lemp;//structFileNode*(p,*(emp;

charoldpath[INPUT_LEN-COMMAND_LEN];

unsignedinti=0;//inti=0

intsign=l;

if(strcmp(ph,'7")==0){//ph是根目录

cp=root;

strcpy(path,'7'');

return1;

}

temp=cp;

strcpy(oldpalh,path);〃保存原路径和指针

if(ph|O]==,/'){〃指针指向根目录的左孩子

cp=root->child;

i++;〃滤过/

strcpy(path,'7");

}

else{

if(cp!=NULL&&cp!=root)

strcat(path,"/");

if(cp&&cp->child){

if(cp->isdir)

cp=cp->child;〃指针指向当前用录的左孩子

else{

primf("路径错误!\n”);

return0;

}

)

)

while(i<=strlen(ph)&&cp){〃继续查找指定路径,如遇到文件那么报错

intj=0;

if(phfi]==7,&&cp->child){

i++;〃略过/

if(cp->isdir)

cp二cp->child;〃继续查找下级目录

else{

printf("路径错误!\n”);

return0;

)

strcat(path,"/");

)

while(ph[i]!=7'&&i<=strlen(ph)){//curpath记录当前要找的路径名

curpath[j]=ph[i];

i++;j++;

)

curpath[j]='\0';

whilc((strcinp(cp->filcname,curpath)!=O||(cp->isdir!=l))&&cp->sibling_ncxt!=NULL)

{cp=cp->sibling_next;}

if(strcmp(cp->fiIcname,curpath)==O){

if(cp->isdir==0){

strcpy(pa(h.oldpath);

cp=temp;

prinlf("是文件不是目录An”);

return0;

)

strcat(path,cp->filename);

)

if(sticmp(cp->filename,curpath)!=O||cp==NULL){

strcpy(path,oldpath);

cp=teinp;

printf("输入路径错误\n");

return0;

)

)

return1;

)

〃命令检查函数

intCheckCommandO{

if(strlen(Para2)==0){

printf("命令语法不正确An");

return0;

}

returnI;

)

〃分解命令子函数

intParseCommandO{

charlnputslINPUT_LENJ;

inti=O,j=O,ch;

unsignedintk=0;

printf("%s>",path);

if(GetInput(Inputs,INPUT_LEN)==-l){〃获取输入

printf("输入行太长入");

return0;

)

Paral[0]=Para2f0]='\0';

〃获取参数Paral,即操作名

while(Inpuis[i]!=''&&Inpuis[i]!='\0'&&i<COMMAND_LEN-l){

Paral[i]=Inputs[i];

i++;

}

Para1[口='0';

if(i==(COMMAND_LEN-l))return1;〃输入命令太长

if(Inputs[i]!+\(y){〃获取参数2,即路径文件名

while(lnpu(s[i]==,'&&i<INPUT_LEN-1)i++;j=O;

while(Inpiits[i]!='\O'&&i<INPUT_LEN-l){

Para2|jJ=Inputs[i];

i++;j++;

)

Para2Lj]='\0';

}

for(k=0;k<strlen(Paral);k++){〃将操作名全部转换成小写字母

ch=tolower((int)Paral[k]);

Paral[k]=ch;

}

return1;

)

温馨提示

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

最新文档

评论

0/150

提交评论