模拟文件系统.docx
- 文档编号:6625753
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:27
- 大小:27.41KB
模拟文件系统.docx
《模拟文件系统.docx》由会员分享,可在线阅读,更多相关《模拟文件系统.docx(27页珍藏版)》请在冰豆网上搜索。
模拟文件系统
操作系统实习报告日期:
实习题目:
模拟文件系统
完成人
姓名:
组号:
学号
实习内容简要描述
构建一棵树形结构的文件系统,要求程序模拟简单的dos文件系统的命令功能
Cd:
类似dos的cd命令
Edit:
创建文件
Del:
删除文件
Rd:
删除目录
Dir:
显示目录
Md:
创建目录
主要代码结构
(附注释)
#include
#include
#include
#include
#include
#defineFILENAME_LEN21
#defineINPUT_LEN81
#defineCOMMAND_LEN11
//结点结构
structFileNode
{
charfilename[FILENAME_LEN];//文件名/目录名
intisdir;//目录文件识别标志
inti_nlink;//文件的链接数
intadr;//文件的地址
structFileNode*parent,*child;//指向父亲的指针和指向左孩子的指针
structFileNode*sibling_prev,*sibling_next;//指向前一个兄弟的指针和指向
//后一个兄弟的指针
};
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")==0)
sign=editComd();//edit命令
elseif(strcmp(Para1,"del")==0)
sign=delComd();//del命令
elseif(strcmp(Para1,"dir")==0)
sign=dirComd();//dir命令
elseif(strcmp(Para1,"md")==0)
sign=mdComd();//md命令
elseif(strcmp(Para1,"rd")==0)
sign=rdComd();//rd命令
elseif(strcmp(Para1,"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;
node->i_nlink=i_nlink;
node->parent=NULL;
node->child=NULL;
node->sibling_prev=NULL;
node->sibling_next=NULL;
returnnode;
}
//初始化文件树
voidInit()
{
structFileNode*bin,*usr,*unix,*etc;
strcpy(path,"/");//根目录为当前目录
////////////////////////////////////////////////////////////////////////
/////////////////////创建初始目录结点///////////////////////////////////
bin=CreateFileNode("bin",1,0);
usr=CreateFileNode("usr",1,0);
unix=CreateFileNode("unix",0,0);
etc=CreateFileNode("etc",1,0);
root=cp=tp=CreateFileNode("/",1,0);
////////////////////////////////////////////////////////////////////////
/////////////////////创建初始目录结点结束///////////////////////////////
////////////////////////////////////////////////////////////////////////
/////////////////////初始目录赋值///////////////////////////////////////
root->parent=NULL;
root->child=bin;
root->sibling_prev=root->sibling_next=NULL;
bin->parent=root;
bin->child=NULL;
bin->sibling_prev=NULL;
bin->sibling_next=usr;
usr->parent=NULL;
usr->child=NULL;
usr->sibling_prev=bin;
usr->sibling_next=unix;
unix->parent=NULL;
unix->child=NULL;
unix->sibling_prev=usr;
unix->sibling_next=etc;
etc->parent=NULL;
etc->child=NULL;
etc->sibling_prev=unix;
etc->sibling_next=NULL;
////////////////////////////////////////////////////////////////////////
/////////////////////初始目录结点赋值结束///////////////////////////////
system("color0E");
printf("\n\n\n\n\n\n\n\n\n\t\t\t欢迎来到模拟文件管理系统");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPressanykeycontinue...");
getch();
system("cls");
printf("你可以输入如下命令进行操作:
\n");
printf("----------------------------------------\n");
printf("\tcd路径转换\n");
printf("\tedit创建文件\n");
printf("\tdel删除文件\n");
printf("\trd删除目录\n");
printf("\tdir显示目录\n");
printf("\tmd创建目录\n");
printf("----------------------------------------\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]='\0';
elsePara2[i]='\0';
j--;
//filename逆转,获得正确的文件或目录名
for(i=0;i { 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 { if((buffer[count]=getchar())==10) { buffer[count]='\0'; returncount; } count++; } while(getchar()! =10); buffer[buffer_len-1]='\0'; return-1; } //分解命令子函数 intParseCommand() { charInputs[INPUT_LEN]; inti=0,j=0,k=0,ch; printf("%s>",path); //获取输入 if(GetInput(Inputs,INPUT_LEN)==-1) { printf("输入行太长。 \n"); return0; } Para1[0]=Para2[0]='\0'; //获取参数Para1,即操作名 while(Inputs[i]! =''&&Inputs[i]! ='\0'&&i { Para1[i]=Inputs[i]; i++; }//while Para1[i]='\0'; //输入命令太长 if(i==(COMMAND_LEN-1))return1; //获取参数2,即路径文件名 if(Inputs[i]! ='\0') { while(Inputs[i]==''&&i j=0; while(Inputs[i]! ='\0'&&i { Para2[j]=Inputs[i]; i++;j++; } Para2[j]='\0'; } Trim(Para1); Trim(Para2); //将操作名全部转换成小写字母 for(k=0;k { ch=tolower((int)Para1[k]); Para1[k]=ch; } return1; } //cd功能处理子函数 intcdComd() { if(! CheckCommand())//命令检查 return0; if(strcmp(Para2,"..")==0) {//对cd..命令的处理 inti; while(cp->sibling_prev) cp=cp->sibling_prev;//找到这一层最左边的结点 if(cp->parent) { cp=cp->parent;//找到父亲结点 } else { return0; } //对当前路径进行相应处理 i=strlen(path); while(path[i]! ='/'&&i>0)i--; if(i! =0) path[i]='\0'; else path[i+1]='\0'; } else { FindPath(Para2);//查找路径 } return1; } //命令格式处理子函数 voidTrim(char*str) { intbegin,end; char*tmp; begin=0; end=strlen(str); //找到字符串第一个非空格的位置 while(str[begin]==''&&str[begin]! ='\0')begin++; //去除字符串尾部空格 while(str[--end]==''); str[end+1]='\0'; //除去空格 if(begin { 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 { curDir[i++]=path[begin++]; } curDir[i]='\0'; Trim(curDir); returnbegin+1; } //查找路径子函数 intFindPath(char*ph) { structFileNode*tp,*temp; charoldpath[INPUT_LEN-COMMAND_LEN]; inti=0; intsign=1; if(strcmp(ph,"/")==0) {//ph是根目录 cp=root; strcpy(path,"/"); return1; } temp=cp; strcpy(oldpath,path);//保存原路径和指针 if(ph[0]=='/') {//指针指向根目录的左孩子 cp=root->child; i++;//滤过'/' strcpy(path,"/"); } else { if(cp! =NULL&&cp! =root) strcat(path,"/"); if(cp&&cp->child) { if(cp->isdir) cp=cp->child;//指针指向当前目录的左孩子 else { printf("路径错误! \n"); return0; } } } while(i<=strlen(ph)&&cp)//继续查找指定路径,如遇到文件则报错 { intj=0; if(ph[i]=='/'&&cp->child) { i++;//略过'/' if(cp->isdir) cp=cp->child;//继续查找下级目录 else { printf("路径错误! \n"); return0; } strcat(path,"/"); } //curpath记录当前要找的路径名 while(ph[i]! ='/'&&i<=strlen(ph)) { curpath[j]=ph[i]; i++;j++; } curpath[j]='\0'; while((strcmp(cp->filename,curpath)! =0||(cp->isdir! =1))&&cp->sibling_next! =NULL) { cp=cp->sibling_next; } if(strcmp(cp->filename,curpath)==0) { if(cp->isdir==0) { strcpy(path,oldpath); cp=temp; printf("是文件不是目录.\n"); return0; } strcat(path,cp->filename); } if(strcmp(cp->filename,curpath)! =0||cp==NULL) { strcpy(path,oldpath); cp=temp; printf("输入路径错误\n"); return0; } } return1; } //创建文件子函数 inteditComd() { chartmp; structFileNode*temp=CreateFileNode("",0,0); intsign; structFileNode*tp; //路径不能为空 if(strlen(Para2)==0) { printf("\n命令格式有错误.\n"); return0; } //长度检查 if(strlen(Para2)>50) { printf("\n文件名过长\n"); return0; } //格式检查 if(! (isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/')) { printf("文件名格式有错! \n");/*文件首字母可以为'字母'或'数字'或'_'或'/'或'回车'*/ return0; } //获取文件名 sign=FindFilename(Para2); if(sign==0) return0; if(cp->isdir! =1)//如当前指针指向的是文件,则报错 { printf("youcannoteditafileinunderafile! \n"); return0; } //创建文件结点,并插入到指定目录下 tp=CreateFileNode("",1,0); strcpy(tp->filename,filename); tp->isdir=0; tp->i_nlink=0; if(cp->child==NULL) { tp->parent=cp; tp->child=NULL; cp->child=tp; tp->sibling_prev=NULL; tp->sibling_next=NULL; } else { temp=cp; //用temp找到新结点插入处 temp=temp->child; while(temp->sibling_next)//findthelastsibingnode { temp=temp->sibling_next; if(strcmp(temp->filename,filename)==0&&temp->isdir==0) { printf("此文件名已存在\n");//重名报错 return0; } }//找到了最后一个结点 temp->sibling_next=tp; tp->parent=NULL; tp->child=NULL; tp->sibling_prev=temp; tp->sibling_next=NULL; } return1; } //创建目录子函数 intmdComd()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 文件系统