(完整word版)操作系统试验——模拟文件管理系统(word文档良心出品)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bool boot();//启动初始化
filenode* find(char *str,filenode *_root);//递归对目录树进行查找
bool cdexc(char *str);//执行cd命令
bool direxc(char *str);//执行dir命令
case 2 : puts("文件/目录已存在!");break;
case 3 : puts("语法不正确!");break;
case 4 : puts("无法删除根目录!");break;
case 5 : puts("不存在命令!");break;
case 6 : 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");break;
Struct FileNode *sibling_prev,*sibling_next;//指向前一个兄弟的指针和后一个兄弟的指针。
}
三、算法设计
3.1
3.2.
bool spile(char *str,char *cmdstr,char *filestr);//切割字符串
bool shell(char *str);//用来解释命令
int shelllen=7;//命令的字符串的长度
typedef struct filenode_i{//文件节点
char filename[FILENAME_LEN];//文件名
bool isdir;//是否目录
int i_nlink;//文件连接数
int adr;//文件地址
struct filenode_i *par;//指向父节点
p=strtok(strclo," ");//调用的strok进行分割
if(p==NULL) return false;
strcpy(cmdstr,p);
p=strtok(NULL," ");
strcpy(filestr,p);
return true;
}
/////////////////////////////////////////////////////////
模拟文件管理系统
一、实验内容
1.基本要求:编写一程序,模拟一个简单的文件管理系统。树型结构,目录下可以是目录,也可以是文件。
在此文件管理系统,可实现的操作有:
改变目录:格式:cd <目录名>
显示目录:格式:dir[<目录名>]
创建目录:格式:md <目录名>
删除目录:格式:rd<目录名>
新建文件:格式:edit<文件名>
二、数据结构设计
StructFileNode
{
Char filename[FILENAME_LEN];//文件名/目录名
Int isdir ;//目录、文件的识别标志
Int i_nlink;//文件链接数
Int adr;//文件的地址
Struct FileNode *parent,*child;//指向父亲的指针和左孩子的指针
int shelllen=7;//命令的字符串的长度
(2)主函数模块
调用boot模块初始化,然后使用while循环,每次循环中用户可以输入命令字符串,调用shell模块进行解释并执行操作,执行完成后再次进入循环,直到用户使用exit退出。
(3)其他模块说明(用文字描述,不要代码)
删除模块:调用find函数查找到目录节点,然后进行删除节点操作,并注意特殊情况。
switch(id){
case 0 : puts("路径不存在!");break;
case 1 : {puts("目录非空,是否删除Y/N");input=getchar();getchar();if(input=='Y'||input=='y')return true;return false;}
case 2: if(strlen(filestr)==0) {errorp(3);return false;}mdexc(filestr);break;
case 3: if(strlen(filestr)==0) {errorp(3);return false;}delexc(filestr,cur,true,true);break;
bool mdexc(char *str);//执行md命令
bool editexc(char *str);//执行edit命令
bool delexc(char *str,filenode *fcur,bool mode,bool dir);//执行del命令
bool exitexc();//退出
filenode* createnode(char *str,bool _isdir,int _adr,filenode *_par);//新建对象节点
bool cdexc(char *str);//执行cd命令
bool direxc(char *str);//执行dir命令
bool mdexc(char *str);//执行md命令
bool editexc(char *str);//执行edit命令
bool delexc(char *str,filenode *fcur,bool mode,bool dir);//执行del命令
bool spile(char *str,char *cmdstr,char *filestr);//切割字符串
bool shell(char *str);//用来解释命令
bool errorp(int id);//打印错误提示
bool boot();//启动初始化
filenode* find(char *str,filenode *_root);//递归对目录树进行查找
struct filenode_i *chi;//指向第一个孩子节点
struct filenode_i *pre;//指向上一个兄弟节点
struct filenode_i *nex;//指向下一个兄弟节点
}filenode;
filenode *cur=NULL;//指向当前目录
filenode *root=NULL;//指向根节点目录
//p2=createnode("hello2",true,0,root);
//p->nex=p2;p2->par=root;p2->pre=p;
//p2->i_nlink=2;
//p=createnode("hello2_1",true,0,p2);
//p2->chi=p;p->par=p2;
//p2=createnode("hello2_2",false,0,p->par);
//p->nex=p2;p2->par=p->par;p2->pre=p;
// }
bool spile(char *str,char *cmdstr,char *filestr){
char strclo[FILENAME_LEN]="";
char *p=NULL;
strcpy(strclo,str);
新建目录/文件模块:通过调用find查找是否重复,若不重复就进行增加节点。
切换目录模块:通过find函数找到节点,然后将cur指针指向该节点。
显示目录模块:通过find函数找到节点,循环遍历该节点显示。
退出模块:执行exit函数。
#include <stdio.h>
#include <stdlib.h>
删除文件:格式:del<文件名>
退出文件系统:exit
2.目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开
3.功能具体描述:
改变目录:改变当前工作目录,目录不存在是给出出错信息
显示目录:显示指定目录下或当前目录下所有文件和一级目录(选做:带/s参数的dir命令,显示所有子目录)
创建目录:在指定路径或当前路径下创建指定目录。重名时给出出错信息。
gets(inputs);
shell(inputs);
}
}
//下面进行函数的实现
//////////////////////////////////////////////////////////////////
//**************************************************************
}else{
strcpy(cmdstr,str);
}
for(i=0;i!=shelllen;i++){
if(strcmp(cmdstr,shellstr[i])==0) re=i;
}
switch(re){//根据解释的命令执行对应的操作
case 0: cdexc(filestr);break;
case 1: direxc(filestr);break;
case 7 : puts("删除对象错误!");break;
default: puts("未知错误!");
}
return true;
}
/////////////////////////////////////////////////////////
bool shell(char *str){
int re=-1;
int i;
char cmdstr[SHELL_LEN]="";
char filestr[FILENAME_LEN]="";
if(strstr(str," ")!=NULL){
if(!spile(str,cmdstr,filestr)) {printf("输入错误!");return false;}
////test
// test(){//这是用来对目录进行测试,在一开始建立目录结构
//filenode *p=createnode("hello",false,0,root);
//filenode *p2=NULL;
//root->i_nlink=2;
//root->chi=p;p->par=root;
#include <string.h>
#define FILENAME_LEN 256
#define SHELL_LEN 5
typedef enum{false,true} bool;
char *shellstr[7]={"cd","dir","md","rd","edit","del","exit"};
删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。
创建文件:创建指定名字的文件,只要创建表示文件的节点即可,内容及大小不考虑。
删除文件:删除指定文件,不存在时给出出错信息。
退出文件系统:exit
4.总体流程:
初始化文件目录
输出提示符,等待接受命令,分析键入的命令;
对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令。直到键入exit退出为止。
case 4: if(strlen(filestr)==0) {errorp(3);return false;}editexc(filestr);break;
case 5: if(strlen(filestr)==0) {errorp(3);return false;}delexc(filestr,cur,true,false);break;
case 6: exitexc();break;
default:errorp(5);break;
}
return true;
}
/////////////////////////////////////////////////////////
bool errorp(int id){
char input=0;
bool exitexc();//退出
filenode* createnode(char *str,bool _isdir,int _adr,filenode *_par);
main(){
char inputs[FILENAME_LEN]="";
boot();
errorp(6);
while(1){
printf("\n>");
函数调用图
3.2.2
建立一刻目录树,根据输入的命令字符串,对该目录树进行增删等操作。
(1)定义全局变量
filenode *cur=NULL;//指向当前目录节点
filenode *root=NULL;//指向根节点目录节点
char *shellstr[7]={"cd","dir","md","rd","edit","del","exit"};//命令字符串