1、操作系统上机实验报告操作系统上机实验报告 课 程 设 计(上 机 实 习)报 告课程设计(上机实验)题目:文件系统的模拟设计目的与任务: 理解操作系统文件系统的某些工作原理,学习文件操作命令和目录操作命令的设计方法。通过实验,使学生加深对操作系统文件系统某些问题的理解,归纳学习方法和思考方法,做到理论联系实际。培养学生分析问题、解决问题的能力,提高学生软件设计能力和逻辑思维能力。设计实现一个简单的文件系统,包括目录文件、普通文件,以及一些文件操作命令和目录操作命令(例如可以模仿DOS的有关命令)。1.修改md命令;2.修改Help命令;3.修改命令行预处理程序;4.新增fc命令,实现两个文件的
2、比较;5.新增batch命令,实现批处理;6. 完善copy命令,改善某些缺陷。内容和要求:1.修改md命令:增加“属性”参数,用于创建指定属性的子目录。命令形式如下:md 。属性包括R、H、S以及它们的组合(不区分大小写,顺序也不限)。例如:md usr rh其功能是在当前目录中创建具有“只读”和“隐藏”属性的子目录user.2.修改Help命令:修改help命令的显示方式和显示内容:修改HelpComd()函数,使之提供菜单式的较详细的帮助信息。例如可以先用菜单形式简单列出各命令名称,当用户选择某个命令的序号后,再比较详细地介绍该命令,包括命令的各种形式,每种形式的功能,以及某些举例说明等
3、等。3.修改命令行预处理程序:修改命令行预处理函数ParseCommand( ),使以下命令行(命令与参数间无空格符)可以正确执行:cd/,cd.,dir/usr.copy/usr/boy mail 即命令名称与后边的“/”或“.”之间不需要空格也能正确执行。4.新增fc命令,实现两个文件的比较:命令形式:fc 5.新增batch命令,实现批处理:命令形式:batch batchfile 命令功能:从磁盘文件batchfile逐行读入命令行执行,直到batchfile中所有命令行都执行完毕为止。6.完善copy命令,改善某些缺陷:正确的功能应该是:若当前目录中不存在文件boy,则报错;第2个命
4、令若当前目录是根目录,因根目录没有父目录,故应报错;若当前目录的父目录中已经存在名为boy的文件,也报错(或询问用户是否覆盖)。其他情况上述命令都应能正确执行。 课 程 设 计(上 机 实 习)报 告设 计 说 明 书(说明书的撰写要求请参看封里的“报告填写说明3”。篇幅不够可附页)1修改md命令 流程图如下:课 程 设 计(上 机 实 习)报 告 设计思想:程序的指令格式为md user |rh,需改为md user rh格式,因此可在md user |rh中修改代码实现修改功能。要实现此功能,只需要获取目录的属性时删除判断操作符“|”的过程即可。具体方法:在GetAttrib函数中删除如下
5、代码: if (str0!=|) coutn命令中属性参数错误。n; return -1; 修改后的操作方法:输入mduserrh即可正确执行 截图如下: 2修改Help命令 流程图如下:课 程 设 计(上 机 实 习)报 告设计思想:利用switch(n) case语句实现选择只查看需了解的操作命令。 具体方法:首先利用cout语句输出改操作系统所拥有的命令.并用数字标明,供用户选择,再利用switch(n)case语句实现具体内容的介绍。例如: cout 1.create t; case 1:cout create n 创建新文件,文件属性是r、h或s。n; break; 运行效果如下:
6、3修改命令行预处理程序 流程图如下: 设计思想:在命令行预处理函数ParseCommand( )中进行修改,使以下命令行(命令与参数间无空格符)可以正确执行:cd/,cd.,dir/usr,copy/usr/boy mail具体方法:在ParseCommand( )处理cd/,dir/usr等情况的代码中增加处理“.”的代码。 for (i=0;comd0i!=0;i+) if (comd0i=/) /处理cd/,dir/usr等情况 break; else if (comd0i=. & comd0i+1=.) break; 4新增fc命令,实现两个文件的比较流程图如下: 设计思想:首先利用P
7、rocessPath()函数和FindFCB()函数查找文件的目录所在首块号和文件所在首块号,判断其存在性,并记录其全路径名。如果需要比较的文件都存在的话则进行比较。 具体实现:int FcComd(int k) if(k!=2) cout出错:输入命令格式错误,请重新输入endl; return false; short int i,j=0,s1,s2,size1,size2,s,s3; char attrib=0,*FileName,*FileName1,Buffer1,Buffer2; FCB* fcbp ,*fcbp1,*fcbp2 ; s=ProcessPath(comd1,File
8、Name,k,0,20);/取FileName所在目录的首块号 if (s1) /路径错误 return s; /失败,返回 s1=FindFCB(FileName,s,attrib,fcbp); /取FileName的首块号(查其存在性) fcbp1=fcbp; if (s10) coutn要比较的文件不存在。n; return -1; s3=ProcessPath(comd2,FileName1,k,0,20);/取FileName1所在目录的首块号 if (s31) /路径错误 return s3; /失败,返回 s2=FindFCB(FileName1,s3,40,fcbp); /取F
9、ileName的首块号(查其存在性) fcbp2=fcbp; if (s20) coutFsize; /取文件一的长度 size2=fcbp2-Fsize; /取文件二的长度 if(size1=0&size2|size2=0&size1) cout两个文件的长度不同:endl; cout文件FileName的长度size1endl; cout文件FileName的长度size2endl; cout0&s20) for(i=0;iSIZE;i+,j+) if(j=size1&j=size2) break; Buffer1=Disks1i; /读第一个文件内容 Buffer2=Disks2i; /
10、读第二个文件内容 if(Buffer1!=Buffer2) /比较 cout文件FileName长度为:size1endl; cout文件FileName长度为:size2endl; cout第一个不同字节的位置为第j+1个字节endl; cout此时两个文件的字符分别为Buffer1和Buffer2endl; return false; if(iSIZE) break; /结束while循环,避免进入死循环 if(j=size1&j=size2) cout两文件内容相同endl; cout文件长度为:size1; return true; return 1;效果图如下:5新增batch命令,
11、实现批处理流程图如下: 设计思想:batch命令从磁盘文件batchfile逐行读入命令行执行,直到batchfile中所有命令行都执行完毕为止。 具体方法:int BatchComd(int k) short i,s,size,jj=0,x=0, y=0; char attrib=0,*FileName; char gFileNamePATH_LEN; /存放文件全路径名 FCB* fcbp; if(k!=1) coutn命令参数中应该只有一个文件名。n; return -1; else s=ProcessPath(comd1,FileName,k,0,020);/取FileName所在目录
12、的首块号 if (s1) /路径错误 return s; /失败,返回 s=FindFCB(FileName,s,attrib,fcbp); /取FileName的首块号(查其存在性) strcpy(gFileName,temppath); i=strlen(temppath); if (temppathi-1!=/) strcat(gFileName,/); strcat(gFileName,FileName); /构造文件的全路径名 if (s0) coutn文件gFileName不存在。n; return -3; if (s=0) coutn文件gFileNameFsize; char Buffer10050; /分配动态内存空间 while (s0) for (i=0;iSIZE;i+,jj+) if (jj=size) break; if(Disksi=n) Bufferxy=0; coutBufferxendl; x+; y=0; else Bufferxy=Disksi; y+; if (iSIZE) Bufferxy=0; break; s=FATs; for(i=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1