1、模拟文件系统操作系统实习报告 日期: 实习题目: 模拟文件系统完成人姓名:组号:学号实习内容简要描述构建一棵树形结构的文件系统,要求程序模拟简单的dos文件系统的命令功能Cd:类似dos的cd命令Edit:创建文件Del: 删除文件Rd:删除目录Dir:显示目录Md:创建目录主要代码结构(附注释)#include #include #include #include #include #define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11/结点结构struct FileNode char filenameFILENAM
2、E_LEN; /文件名/目录名 int isdir; /目录文件识别标志 int i_nlink; /文件的链接数 int adr; /文件的地址 struct FileNode *parent, *child;/指向父亲的指针和指向左孩子的指针 struct FileNode *sibling_prev, *sibling_next;/指向前一个兄弟的指针和指向 /后一个兄弟的指针;void Init(); /初始化文件树int ParseCommand(); /接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand(); /执行命令int cdComd(); /
3、处理cd命令int editComd(); /处理edit命令int delComd(); /处理del命令int rdComd(); /处理rd命令int dirComd(); /处理dir命令int mdComd(); /处理md命令int FindPath(char *ph);/寻找参数ph所指向的路径/从参数Para2中找到要建立或删除的文件、目录名,并把指针指向其父亲结点int FindFilename(char Para2);struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink);/创建结点int G
4、etInput(char* buffer,unsigned int buffer_len);/获取输入int CheckCommand(); /命令检查int GetDir(int begin,char* path,char* curDir);/获取路径void Trim(char* str);struct FileNode * cp, *tp, *root,*upper;char pathINPUT_LEN-COMMAND_LEN;/记录当前走过的路径char curpathINPUT_LEN-COMMAND_LEN,Para1COMMAND_LEN,Para2INPUT_LEN-COMMA
5、ND_LEN,tmppathINPUT_LEN-COMMAND_LEN;char filenameFILENAME_LEN,dirnameFILENAME_LEN,tmp;int i,j;/主函数int main() Init();/初始化文件树 while(1) if(ParseCommand()/分解命令 ExecuteCommand();/执行命令 /执行命令子函数void ExecuteCommand() int sign; /根据参数Para1调用相应的功能处理模块 if(strcmp(Para1,cd)=0) sign=cdComd(); /cd命令 else if(strcmp(
6、Para1,edit)=0) sign=editComd(); /edit命令 else if(strcmp(Para1,del)=0) sign=delComd(); /del命令 else if(strcmp(Para1,dir)=0) sign=dirComd(); /dir命令 else if(strcmp(Para1,md)=0) sign=mdComd(); /md命令 else if(strcmp(Para1,rd)=0) sign=rdComd(); /rd命令 else if(strcmp(Para1,exit)=0) exit(0); /exit命令 else printf
7、(命令错误,请重试n); /命令输入不正确,报错/创建结点struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink) /申请结点空间 struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode); /相应内容赋初值 strcpy(node-filename,filename); node-isdir=isdir; node-i_nlink=i_nlink; node-parent=NULL; node-child=NULL; node-s
8、ibling_prev=NULL; node-sibling_next=NULL; return node;/初始化文件树void Init() struct FileNode *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 = CreateF
9、ileNode(/,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 -
10、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(color 0E); printf(nnnnnnnnnttt 欢迎来到模拟文件管理系统); printf(nnnnnnnnnnnn
11、nnnPress any key continue.); getch(); system(cls); printf(你可以输入如下命令进行操作:n); printf(-n); printf(t cd 路径转换n); printf(t edit 创建文件n); printf(t del 删除文件n); printf(t rd 删除目录n); printf(t dir 显示目录n); printf(t md 创建目录n); printf(-n);/获取文件或目录名,并把指针指向其父亲结点int FindFilename(char Para2) i=strlen(Para2)-1; j=0; whi
12、le(Para2i!=/& i=0) filenamej=Para2i; i-; j+; filenamej=0;/获得逆序的文件或目录名,存入filename中 if(i0) Para2i+1=0; else Para2i=0; j-; /filename逆转,获得正确的文件或目录名 for(i=0;i0) int sign=FindPath(Para2); if(sign=0) return 0; return 1;/缓冲区安全输入子函数/如果输入超过buffer_len,则截取前buffer_len-1长度的输入,/buffer_len处字符用/0代替int GetInput(char*
13、 buffer,unsigned int buffer_len) int count=0; while(count,path); /获取输入 if(GetInput(Inputs,INPUT_LEN)=-1) printf(输入行太长。n); return 0; Para10=Para20=0; /获取参数Para1,即操作名 while(Inputsi!= & Inputsi!=0 & iCOMMAND_LEN-1) Para1i=Inputsi; i+; /while Para1i=0; /输入命令太长 if(i=(COMMAND_LEN-1)return 1; /获取参数2,即路径文件名
14、 if(Inputsi!=0) while(Inputsi= & iINPUT_LEN-1) i+; j=0; while(Inputsi!=0 & iINPUT_LEN-1) Para2j=Inputsi; i+; j+; Para2j=0; Trim(Para1); Trim(Para2); /将操作名全部转换成小写字母 for(k=0;ksibling_prev) cp=cp-sibling_prev;/找到这一层最左边的结点 if(cp-parent) cp=cp-parent; /找到父亲结点 else return 0; /对当前路径进行相应处理 i=strlen(path); w
15、hile(pathi!=/& i0) i-; if(i!=0) pathi=0; else pathi+1=0; else FindPath(Para2);/查找路径 return 1;/命令格式处理子函数void Trim(char* str) int begin,end; char* tmp; begin=0; end=strlen(str); /找到字符串第一个非空格的位置 while(strbegin= & strbegin!=0)begin+; /去除字符串尾部空格 while(str-end= ); strend+1=0; /除去空格 if(beginend) tmp=(char*
16、)malloc(sizeof(char)*(end-begin+2); strcpy(tmp,&strbegin); strcpy(str,tmp); free(tmp); /获取当前目录名子函数int GetDir(int begin,char* path,char* curDir) int i=0; int len=strlen(path); while(!(pathbegin= )| (pathbegin=/)&beginchild; i+; /滤过/ strcpy(path,/); else if(cp!=NULL & cp!=root ) strcat(path,/); if(cp
17、& cp-child) if(cp-isdir) cp=cp-child; /指针指向当前目录的左孩子 else printf(路径错误!n); return 0; while(ichild) i+;/略过 / if(cp-isdir) cp=cp-child;/继续查找下级目录 else printf(路径错误!n); return 0; strcat(path,/); /curpath 记录当前要找的路径名 while(phi!=/& ifilename,curpath)!=0 | (cp-isdir!=1)& cp-sibling_next!=NULL) cp=cp-sibling_ne
18、xt; if(strcmp(cp-filename,curpath)=0 ) if(cp-isdir=0) strcpy(path,oldpath); cp=temp; printf(是文件不是目录.n); return 0; strcat(path,cp-filename); if(strcmp(cp-filename,curpath)!=0 | cp=NULL) strcpy(path,oldpath); cp=temp; printf(输入路径错误n); return 0; return 1;/创建文件子函数int editComd() char tmp; struct FileNode
19、 * temp=CreateFileNode(,0,0); int sign; struct FileNode *tp; /路径不能为空 if(strlen(Para2)=0) printf(n命令格式有错误.n); return 0; /长度检查 if(strlen(Para2)50) printf(n文件名过长n); return 0; /格式检查 if (!(isalpha(Para20)|Para20=_|Para20=0|Para20=/) printf(文件名格式有错!n);/* 文件首字母可以为字母或数字或_或/或回车*/ return 0; /获取文件名 sign=FindFi
20、lename(Para2); if(sign=0) return 0; if(cp-isdir!=1)/如当前指针指向的是文件,则报错 printf(you cannot edit a file in under a file!n); return 0; /创建文件结点,并插入到指定目录下 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_pr
21、ev=NULL; tp-sibling_next=NULL; else temp=cp; /用temp找到新结点插入处 temp=temp-child; while(temp-sibling_next )/find the last sibing node temp=temp-sibling_next; if(strcmp(temp-filename,filename)=0&temp-isdir=0) printf(此文件名已存在n);/重名报错 return 0; /找到了最后一个结点 temp-sibling_next=tp; tp-parent=NULL; tp-child=NULL; tp-sibling_prev=temp; tp-sibling_next=NULL; return 1;/创建目录子函数int mdComd()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1