操作系统试验模拟文件管理系统Word下载.docx
《操作系统试验模拟文件管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统试验模拟文件管理系统Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
{
Charfilename[FILENAME_LEN];
//文件名/目录名
Intisdir;
//目录、文件的识别标志
Inti_nlink;
//文件链接数
Intadr;
//文件的地址
StructFileNode*parent,*child;
//指向父亲的指针和左孩子的指针
StructFileNode*sibling_prev,*sibling_next;
//指向前一个兄弟的指针和后一个兄弟的指针。
}
三、算法设计
3.1功能模块图
3.2算法思路
3.2.1实现方法
boolspile(char*str,char*cmdstr,char*filestr);
//切割字符串
boolshell(char*str);
//用来解释命令
boolerrorp(intid);
//打印错误提示
boolboot();
//启动初始化
filenode*find(char*str,filenode*_root);
//递归对目录树进行查找
boolcdexc(char*str);
//执行cd命令
booldirexc(char*str);
//执行dir命令
boolmdexc(char*str);
//执行md命令
booleditexc(char*str);
//执行edit命令
booldelexc(char*str,filenode*fcur,boolmode,booldir);
//执行del命令
boolexitexc();
//退出
filenode*createnode(char*str,bool_isdir,int_adr,filenode*_par);
//新建对象节点
函数调用图
3.2.2设计思想
建立一刻目录树,根据输入的命令字符串,对该目录树进行增删等操作。
(1)定义全局变量
filenode*cur=NULL;
//指向当前目录节点
filenode*root=NULL;
//指向根节点目录节点
char*shellstr[7]={"
cd"
"
dir"
md"
rd"
edit"
del"
exit"
};
//命令字符串
intshelllen=7;
//命令的字符串的长度
(2)主函数模块
调用boot模块初始化,然后使用while循环,每次循环中用户可以输入命令字符串,调用shell模块进行解释并执行操作,执行完成后再次进入循环,直到用户使用exit退出。
(3)其他模块说明(用文字描述,不要代码)
删除模块:
调用find函数查找到目录节点,然后进行删除节点操作,并注意特殊情况。
新建目录/文件模块:
通过调用find查找是否重复,若不重复就进行增加节点。
切换目录模块:
通过find函数找到节点,然后将cur指针指向该节点。
显示目录模块:
通过find函数找到节点,循环遍历该节点显示。
退出模块:
执行exit函数。
代码:
#include<
stdio.h>
stdlib.h>
string.h>
#defineFILENAME_LEN256
#defineSHELL_LEN5
typedefenum{false,true}bool;
typedefstructfilenode_i{//文件节点
charfilename[FILENAME_LEN];
//文件名
boolisdir;
//是否目录
inti_nlink;
//文件连接数
intadr;
//文件地址
structfilenode_i*par;
//指向父节点
structfilenode_i*chi;
//指向第一个孩子节点
structfilenode_i*pre;
//指向上一个兄弟节点
structfilenode_i*nex;
//指向下一个兄弟节点
}filenode;
//指向当前目录
//指向根节点目录
main(){
charinputs[FILENAME_LEN]="
"
;
boot();
errorp(6);
while
(1){
printf("
\n>
);
gets(inputs);
shell(inputs);
}
}
//下面进行函数的实现
//////////////////////////////////////////////////////////////////
//**************************************************************
////test
//test(){//这是用来对目录进行测试,在一开始建立目录结构
//filenode*p=createnode("
hello"
false,0,root);
//filenode*p2=NULL;
//root->
i_nlink=2;
chi=p;
p->
par=root;
//p2=createnode("
hello2"
true,0,root);
//p->
nex=p2;
p2->
pre=p;
//p2->
//p=createnode("
hello2_1"
true,0,p2);
par=p2;
hello2_2"
false,0,p->
par);
par=p->
par;
//}
boolspile(char*str,char*cmdstr,char*filestr){
charstrclo[FILENAME_LEN]="
char*p=NULL;
strcpy(strclo,str);
p=strtok(strclo,"
"
//调用的strok进行分割
if(p==NULL)returnfalse;
strcpy(cmdstr,p);
p=strtok(NULL,"
strcpy(filestr,p);
returntrue;
/////////////////////////////////////////////////////////
boolshell(char*str){
intre=-1;
inti;
charcmdstr[SHELL_LEN]="
charfilestr[FILENAME_LEN]="
if(strstr(str,"
)!
=NULL){
if(!
spile(str,cmdstr,filestr)){printf("
输入错误!
returnfalse;
}else{
strcpy(cmdstr,str);
for(i=0;
i!
=shelllen;
i++){
if(strcmp(cmdstr,shellstr[i])==0)re=i;
switch(re){//根据解释的命令执行对应的操作
case0:
cdexc(filestr);
break;
case1:
direxc(filestr);
case2:
if(strlen(filestr)==0){errorp(3);
}mdexc(filestr);
case3:
}delexc(filestr,cur,true,true);
case4:
}editexc(filestr);
case5:
}delexc(filestr,cur,true,false);
case6:
exitexc();
default:
errorp(5);
boolerrorp(intid){
charinput=0;
switch(id){
case0:
puts("
路径不存在!
case1:
{puts("
目录非空,是否删除Y/N"
input=getchar();
getchar();
if(input=='
Y'
||input=='
y'
)returntrue;
case2:
文件/目录已存在!
case3:
语法不正确!
case4:
无法删除根目录!
case5:
不存在命令!
case6:
printf("
有下列命令可供使用:
\n[1]cd\t切换当前目录\n[2]dir\t显示目录内容\n[3]md\t新建目录\n[4]rd\t删除目录\n[5]edit\t新建文件\n[7]del\t删除文件\n[8]exit\t推出系统\n\n"
case7:
删除对象错误!
default:
未知错误!
}
boolboot(){
filenode*p=createnode("
root"
true,0,NULL);
//建立根目录
cur=p;
root=p;
//test();
boolcdexc(char*str){
filenode*fcur=find(str,cur);
//find找到路径,并切换
if(strlen(str)==0){returntrue;
if(strcmp(str,"
.."
)==0){cur=(cur->
par!
=NULL?
cur->
par:
cur);
returntrue;
}//特殊父目录符号..
if(fcur==NULL||!
fcur->
isdir){errorp(0);
cur=fcur;
returntrue;
booldirexc(char*str){
char*dirstr[2]={"
<
file>
dir>
filenode*loop=find(str,cur);
if(strlen(str)==0){
loop=cur;
}else{
if(loop==NULL){errorp(0);
}elseif(!
loop->
isdir){errorp(0);
}//判断查找目录是否成功?
该目录含有%d个项目\n"
loop->
i_nlink);
loop=loop->
chi;
while(loop!
=NULL){//输出目录所有项目
printf("
%s\t%s\n"
dirstr[loop->
isdir],loop->
filename);
loop=loop->
nex;
boolmdexc(char*str){
filenode*tmp=find(str,cur);
/"
=NULL){errorp(3);
}//判断语法,目录名不能含有“/”
if(tmp!
=NULL){errorp
(2);
}//判断目录是否已经存在
tmp=createnode(str,true,0,cur);
//创建节点
if(cur->
chi!
=NULL){
cur->
chi->
pre=tmp;
//插入该节点
tmp->
nex=cur->
cur->
chi=tmp;
i_nlink++;
booleditexc(char*str){
intinputc;
}//判断语法,文件名不能含有“/”
}//判断文件是否已经存在
请输入文件地址:
scanf("
%d"
&
inputc);
tmp=createnode(str,false,inputc,cur);
booldelexc(char*str,filenode*fcur,boolmode,booldir){
filenode*loop=NULL;
filenode*looppre=NULL;
filenode*tp=find(str,fcur);
)==0){errorp(4);
}//删除根目录的处理
loop=cur;
while(loop!
=NULL){if(tp==loop){cur=tp->
}loop=loop->
}//删除当前目录的上N层目录
if(tp==NULL){if(mode)errorp(0);
}//判断是否找到路径,mode为安静模式,不显示警告信息
if(mode)if(tp->
isdir!
=dir){errorp(7);
}//判断命令要求删除的对象,fileordir
if(tp->
isdir){
if(tp->
i_nlink!
=0){//判断空目录
if(!
errorp
(1))returnfalse;
loop=tp->
looppre=loop;
while(loop!
=NULL){//递归删除
if(delexc(loop->
filename,loop,false,dir)){
loop=looppre->
continue;
}
looppre=loop;
loop=loop->
}
}
//删除节点
nex!
=NULL)tp->
nex->
pre=tp->
pre;
pre!
=NULL){tp->
pre->
nex=tp->
}else{tp->
par->
chi=tp->
i_nlink--;
free(tp);
boolexitexc(){
exit(0);
filenode*createnode(char*str,bool_isdir,int_adr,filenode*_par){
filenode*tmp=malloc(sizeof(filenode));
strcpy(tmp->
filename,str);
isdir=_isdir;
i_nlink=0;
adr=_adr;
tmp->
pre=NULL;
par=_par;
chi=NULL;
nex=NULL;
returntmp;
filenode*find(char*str,filenode*_root){
//x/x/xxx/四种命令情况
charcurstr[FILENAME_LEN]="
//用于存放/左侧字符
char*filestr=strstr(str,"
//用于存放/右侧字符
if(filestr==NULL){//x相对路径
if(str[0]=='
\0'
){return_root;
}//x/
loop=_root->
if(strcmp(loop->
filename,str)==0){
returnloop;
returnNULL;
if(filestr==str)returnfind(filestr+1,root);
///x绝对路径
strncpy(curstr,str,(filestr-str));
loop=_root->
=NULL){//x/x访问目录所有项目进行查找
if(loop->
isdir&
&
strcmp(loop->
filename,curstr)==0){
returnfind(filestr+1,loop);
//进行递归查找子目录