模拟文件系统Word格式.docx

上传人:b****6 文档编号:19639498 上传时间:2023-01-08 格式:DOCX 页数:27 大小:27.41KB
下载 相关 举报
模拟文件系统Word格式.docx_第1页
第1页 / 共27页
模拟文件系统Word格式.docx_第2页
第2页 / 共27页
模拟文件系统Word格式.docx_第3页
第3页 / 共27页
模拟文件系统Word格式.docx_第4页
第4页 / 共27页
模拟文件系统Word格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

模拟文件系统Word格式.docx

《模拟文件系统Word格式.docx》由会员分享,可在线阅读,更多相关《模拟文件系统Word格式.docx(27页珍藏版)》请在冰豆网上搜索。

模拟文件系统Word格式.docx

//后一个兄弟的指针

};

voidInit();

//初始化文件树

intParseCommand();

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

voidExecuteCommand();

//执行命令

intcdComd();

//处理cd命令

inteditComd();

//处理edit命令

intdelComd();

//处理del命令

intrdComd();

//处理rd命令

intdirComd();

//处理dir命令

intmdComd();

//处理md命令

intFindPath(char*ph);

//寻找参数ph所指向的路径

//从参数Para2中找到要建立或删除的文件、目录名,并把指针指向其父亲结点

intFindFilename(charPara2[]);

structFileNode*CreateFileNode(charfilename[],intisdir,inti_nlink);

//创建结点

intGetInput(char*buffer,unsignedintbuffer_len);

//获取输入

intCheckCommand();

//命令检查

intGetDir(intbegin,char*path,char*curDir);

//获取路径

voidTrim(char*str);

structFileNode*cp,*tp,*root,*upper;

charpath[INPUT_LEN-COMMAND_LEN];

//记录当前走过的路径

charcurpath[INPUT_LEN-COMMAND_LEN],Para1[COMMAND_LEN],

Para2[INPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LEN];

charfilename[FILENAME_LEN],dirname[FILENAME_LEN],tmp;

inti,j;

//主函数

intmain()

Init();

//初始化文件树

while

(1)

{

if(ParseCommand())//分解命令

ExecuteCommand();

//执行命令

}

}

//执行命令子函数

voidExecuteCommand()

intsign;

//根据参数Para1调用相应的功能处理模块

if(strcmp(Para1,"

cd"

)==0)

sign=cdComd();

//cd命令

elseif(strcmp(Para1,"

edit"

sign=editComd();

//edit命令

del"

sign=delComd();

//del命令

dir"

sign=dirComd();

//dir命令

md"

sign=mdComd();

//md命令

rd"

sign=rdComd();

//rd命令

exit"

)==0)

exit(0);

//exit命令

else

printf("

命令错误,请重试\n"

);

//命令输入不正确,报错

structFileNode*CreateFileNode(charfilename[],intisdir,inti_nlink)

//申请结点空间

structFileNode*node=(structFileNode*)malloc(sizeof(structFileNode));

//相应内容赋初值

strcpy(node->

filename,filename);

node->

isdir=isdir;

i_nlink=i_nlink;

parent=NULL;

child=NULL;

sibling_prev=NULL;

sibling_next=NULL;

returnnode;

voidInit()

structFileNode*bin,*usr,*unix,*etc;

strcpy(path,"

/"

//根目录为当前目录

////////////////////////////////////////////////////////////////////////

/////////////////////创建初始目录结点///////////////////////////////////

bin=CreateFileNode("

bin"

1,0);

usr=CreateFileNode("

usr"

unix=CreateFileNode("

unix"

0,0);

etc=CreateFileNode("

etc"

root=cp=tp=CreateFileNode("

/////////////////////创建初始目录结点结束///////////////////////////////

/////////////////////初始目录赋值///////////////////////////////////////

root->

parent=NULL;

child=bin;

sibling_prev=root->

sibling_next=NULL;

bin->

parent=root;

child=NULL;

sibling_prev=NULL;

sibling_next=usr;

usr->

sibling_prev=bin;

sibling_next=unix;

unix->

sibling_prev=usr;

sibling_next=etc;

etc->

sibling_prev=unix;

/////////////////////初始目录结点赋值结束///////////////////////////////

system("

color0E"

printf("

\n\n\n\n\n\n\n\n\n\t\t\t欢迎来到模拟文件管理系统"

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPressanykeycontinue..."

getch();

cls"

你可以输入如下命令进行操作:

\n"

----------------------------------------\n"

\tcd路径转换\n"

\tedit创建文件\n"

\tdel删除文件\n"

\trd删除目录\n"

\tdir显示目录\n"

\tmd创建目录\n"

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

intFindFilename(charPara2[])

i=strlen(Para2)-1;

j=0;

while(Para2[i]!

='

/'

&

i>

=0)

{

filename[j]=Para2[i];

i--;

j++;

filename[j]='

\0'

;

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

if(i<

0)Para2[i+1]='

elsePara2[i]='

j--;

//filename逆转,获得正确的文件或目录名

for(i=0;

i<

strlen(filename)/2;

i++,j--)

tmp=filename[i];

filename[i]=filename[j];

filename[j]=tmp;

//查找路径

if(strlen(Para2)>

0)

intsign=FindPath(Para2);

if(sign==0)return0;

return1;

//缓冲区安全输入子函数

//如果输入超过buffer_len,则截取前buffer_len-1长度的输入,

//buffer_len处字符用'

/0'

代替

intGetInput(char*buffer,unsignedintbuffer_len)

intcount=0;

while(count<

buffer_len)

if((buffer[count]=getchar())==10)

{

buffer[count]='

returncount;

}

count++;

while(getchar()!

=10);

buffer[buffer_len-1]='

return-1;

}

//分解命令子函数

intParseCommand()

charInputs[INPUT_LEN];

inti=0,j=0,k=0,ch;

%s>

"

path);

//获取输入

if(GetInput(Inputs,INPUT_LEN)==-1)

输入行太长。

return0;

Para1[0]=Para2[0]='

//获取参数Para1,即操作名

while(Inputs[i]!

'

&

Inputs[i]!

i<

COMMAND_LEN-1)

Para1[i]=Inputs[i];

i++;

}//while

Para1[i]='

//输入命令太长

if(i==(COMMAND_LEN-1))return1;

//获取参数2,即路径文件名

if(Inputs[i]!

while(Inputs[i]=='

INPUT_LEN-1)i++;

j=0;

while(Inputs[i]!

INPUT_LEN-1)

{

Para2[j]=Inputs[i];

i++;

Para2[j]='

Trim(Para1);

Trim(Para2);

//将操作名全部转换成小写字母

for(k=0;

k<

strlen(Para1);

k++)

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

Para1[k]=ch;

//cd功能处理子函数

intcdComd()

if(!

CheckCommand())//命令检查

if(strcmp(Para2,"

.."

{//对cd..命令的处理

inti;

while(cp->

sibling_prev)

cp=cp->

sibling_prev;

//找到这一层最左边的结点

if(cp->

parent)

parent;

//找到父亲结点

else

return0;

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

i=strlen(path);

while(path[i]!

0)i--;

if(i!

path[i]='

path[i+1]='

FindPath(Para2);

//查找路径

//命令格式处理子函数

voidTrim(char*str)

intbegin,end;

char*tmp;

begin=0;

end=strlen(str);

//找到字符串第一个非空格的位置

while(str[begin]=='

str[begin]!

)begin++;

//去除字符串尾部空格

while(str[--end]=='

str[end+1]='

//除去空格

if(begin<

end)

tmp=(char*)malloc((sizeof(char))*(end-begin+2));

strcpy(tmp,&

str[begin]);

strcpy(str,tmp);

free(tmp);

//获取当前目录名子函数

intGetDir(intbegin,char*path,char*curDir)

inti=0;

intlen=strlen(path);

while(!

((path[begin]=='

\\'

)||(path[begin]=='

))&

begin<

len)

curDir[i++]=path[begin++];

curDir[i]='

Trim(curDir);

returnbegin+1;

//查找路径子函数

intFindPath(char*ph)

structFileNode*tp,*temp;

charoldpath[INPUT_LEN-COMMAND_LEN];

intsign=1;

if(strcmp(ph,"

{//ph是根目录

cp=root;

strcpy(path,"

return1;

temp=cp;

strcpy(oldpath,path);

//保存原路径和指针

if(ph[0]=='

{//指针指向根目录的左孩子

cp=root->

child;

//滤过'

else

if(cp!

=NULL&

cp!

=root)

strcat(path,"

if(cp&

cp->

child)

if(cp->

isdir)

cp=cp->

//指针指向当前目录的左孩子

else

{

printf("

路径错误!

return0;

}

while(i<

=strlen(ph)&

cp)//继续查找指定路径,如遇到文件则报错

intj=0;

if(ph[i]=='

//略过'

//继续查找下级目录

//curpath记录当前要找的路径名

while(ph[i]!

=strlen(ph))

curpath[j]=ph[i];

curpath[j]='

while((strcmp(cp->

filename,curpath)!

=0||(cp->

isdir!

=1))&

sibling_next!

=NULL)

sibling_next;

if(strcmp(cp->

filename,curpath)==0)

isdir==0)

strcpy(path,oldpath);

cp=temp;

是文件不是目录.\n"

strcat(path,cp->

filename);

=0||cp==NULL)

strcpy(path,oldpath);

cp=temp;

printf("

输入路径错误\n"

//创建文件子函数

inteditComd()

{

chartmp;

structFileNode*temp=CreateFileNode("

structFileNode*tp;

//路径不能为空

if(strlen(Para2)==0)

\n命令格式有错误.\n"

//长度检查

50)

\n文件名过长\n"

//格式检查

if(!

(isalpha(Para2[0])||Para2[0]=='

_'

||Para2[0]=='

))

文件名格式有错!

/*文件首字母可以为'

字母'

或'

数字'

回车'

*/

//获取文件名

sign=FindFilename(Para2);

if(sign==0)

if(cp->

=1)//如当前指针指向的是文件,则报错

youcannoteditafileinunderafile!

//创建文件结点,并插入到指定目录下

tp=CreateFileNode("

strcpy(tp->

tp->

isdir=0;

i_nlink=0;

child==NULL)

tp->

parent=cp;

cp->

child=tp;

temp=cp;

//用temp找到新结点插入处

temp=temp->

while(temp->

sibling_next)//findthelastsibingnode

temp=temp->

if(strcmp(temp->

filename,filename)==0&

temp->

此文件名已存在\n"

//重名报错

}//找到了最后一个结点

temp->

sibling_next=tp;

sibling_prev=temp;

//创建目录子函数

intmdComd()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1