模拟文件系统Word格式.docx
- 文档编号:19639498
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:27
- 大小:27.41KB
模拟文件系统Word格式.docx
《模拟文件系统Word格式.docx》由会员分享,可在线阅读,更多相关《模拟文件系统Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
//后一个兄弟的指针
};
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()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 文件系统