操作系统试验模拟文件管理系统Word下载.docx

上传人:b****3 文档编号:18502277 上传时间:2022-12-18 格式:DOCX 页数:15 大小:110.06KB
下载 相关 举报
操作系统试验模拟文件管理系统Word下载.docx_第1页
第1页 / 共15页
操作系统试验模拟文件管理系统Word下载.docx_第2页
第2页 / 共15页
操作系统试验模拟文件管理系统Word下载.docx_第3页
第3页 / 共15页
操作系统试验模拟文件管理系统Word下载.docx_第4页
第4页 / 共15页
操作系统试验模拟文件管理系统Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

操作系统试验模拟文件管理系统Word下载.docx

《操作系统试验模拟文件管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统试验模拟文件管理系统Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

操作系统试验模拟文件管理系统Word下载.docx

{

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);

//进行递归查找子目录

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

当前位置:首页 > 总结汇报 > 实习总结

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

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