课程设计(上机实验)报告课程名称:计算机操作系统学生姓名:李凌锋学号:1402120120所在学院:电子与信息工程学院专业:电子与信息工程指导教师:吴军华2014年11月20日-1-课程设计(上机实验)题目:修改或增加操作系统程序指令实验目的:理解操作系统文件系统的某些工作原理,学习文件操作命令的设计方法。通过实验,使学生加深对操作系统文件系统某些问题的理解,归纳学习方法和思考方法,做到理论联系实际。培养学生分析问题、解决问题的能力,提高学生软件设计能力和逻辑思维能力。实验任务:1.修改创建子目录的md命令2.修改copy命令3.新增fc命令,实现两个文件的比较4.修改del等命令,使其可以使用统配符*-2-内容和要求:在此次实验过程中,具体的实验内容如下:1.修改创建子目录的md命令修改md命令,增加“属性”参数,用于创建指定属性的子目录。命令形式如下:md目录名[属性]属性包括R、H、S以及它们的组合(不区分大小写,顺序也不限)。例如:mduserrh其功能是在当前目录中创建具有“只读”和“隐藏”属性的子目录user。2.修改copy命令参考程序中的copy命令不能处理如下情况:假设当前目录是/usr,执行如下命令之一copyboy/copyboy..上述2条命令应该是将当前目录/usr中的文件boy复制到其父目录(根目录)中,文件名仍为boy。但系统不能正确执行,而显示“目标文件名错误”的信息。正确的功能应该是:若当前目录中不存在文件boy,则报错;第2个命令若当前目录是根目录,因根目录没有父目录,故应报错;若当前目录的父目录中已经存在名为boy的文件,也报错(或询问用户是否覆盖)。其他情况上述命令都应能正确执行。请按此要求修改copy命令处理程序,使之在上述命令形式也能正确执行。3.新增fc命令,实现两个文件的比较命令形式:fc文件名1文件名2命令功能:逐个字节比较指定的两个文件,若相同,显示“文件内容相同”字样;若不同,显示第一个不同字节的位置和各自的内容。若文件不存在则报错。4.修改del等命令,使其可以使用统配符*del*——删除当前目录中的所有文件-3-实验具体操作:1.修改创建子目录的md命令修改md指令我用了两种方法(为了保证程序能正确执行其中一种方法已经注释掉了)。第一种方法是像文件创建函数那样直接处理属性参数而不调用GetAttib,这样也可以排除GetAttib的影响。第二种直接修改GetAttib指令,由于原来的GetAttib指令规定输入的第二个参数首字节不是|则报错,所以注释掉对应部分,并设置从str[0]开始分析即可。第一种方法是我独立完成的。在修改这条指令之前我注意到文件创建的指令中可以有属性参数,因此我参考了CreateComd即create命令处理函数中处理文件属性的部分内容对md指令进行了修改。以下为该方法所需要添加的程序段。(在添加属性处理的程序段时需要同时添加一些新的变量)/////////////////////////新加的变量//shorti_uof;//chargFileName[PATH_LEN];//存放文件全路径名//charch,*q;/////////////////////////创建文件处理属性的方法//重新定义一些变量移植到目录属性的处理程序/*if(k==2){q=comd[2];while(*q!='\0')//处理文件属性{ch=*q;ch=tolower(ch);switch(ch){-4-case'r':attrib=attrib|(char)1;break;case'h':attrib=attrib|(char)2;break;case's':attrib=attrib|(char)4;break;default:cout\n输入的文件属性错误。\n;return-3;}q++;}}*/第二种方法是在同学提醒我修改GetAttrib函数才实现的。具体操作是将以下程序段去除,并使for循环中的i从0开始,即最先读取的是命令中第二个参数的第一个字符。/*if(str[0]!='|'){cout\n命令中属性参数错误。\n;return-1;}*/在提交的源程序中我采用的是第二种方法。-5-开始结束命令格式是否正确指定路径是否正确新目录是否有重名在指定目录中查找空目录项(若已无空目录项,则为其分配新的盘块),找到后为新目录登记目录项。为新目录分配1盘块,用于登记该目录的第一个目录项,即“..”目录项。调用GetAttrib函数处理相关属性信息显示相关的错误信息是是是否否否-6-2.修改copy命令对于这条指令的修改,我主要是与同学合作完成的。以下是添加的主要程序段,新增变量的声明和一些细节没有列出。if(strcmp(temppath,/)==0&&s02==5001){s2=1;}elseif(strcmp(temp1,..)==0){s2=FindPath(..,a,1,fcbp3);//找指定目录(的首块号),源文件的父目录的首块号if(s2==-1){cout根目录无父目录!endl;//如果当前目录为根目录FindPath返回-1return-4;}}本程序段的主要功能是找到源文件的父目录的首块号,如果此目录是根目录则返回对应的错误信息。是否为根目录是根据FindPath函数的返回值来判断的。(注:因为版面问题流程图中向父目录复制文件的具体步骤省略)开始命令格式正确吗?源文件存在吗?显示“源文件不存在。”显示“命令中参数太多或太少”是否否-7-3.新增fc命令,实现两个文件的比较该部分内容主要流程是自己思考,但由于能力有限,部分功能的具体实现是与同学讨论得出的,程序的源代码如下。intFcComd(intk){if(k!=2){cout出错:输入命令格式错误,请重新输入endl;returnfalse;}shortinti,j=0,s1,s2,size1,size2,s,s3;charattrib='\0',*FileName,*FileName1,Buffer1,Buffer2;FCB*fcbp,*fcbp1,*fcbp2;s=ProcessPath(comd[1],FileName,k,0,'\20');//取FileName所在目录的首块号if(s1)//路径错误returns;//失败,返回s1=FindFCB(FileName,s,attrib,fcbp);//取FileName的首块号(查其存在性)fcbp1=fcbp;if(s10){cout\n要比较的文件不存在。\n;return-1;}s3=ProcessPath(comd[2],FileName1,k,0,'\20');//取FileName1所在目录的首块号if(s31)//路径错误returns3;//失败,返回s2=FindFCB(FileName1,s3,'\40',fcbp);//取FileName的首块号(查其存在性)fcbp2=fcbp;if(s20){cout\n要比较的文件不存在。\n;return-2;}size1=fcbp1-Fsize;//取文件一的长度size2=fcbp2-Fsize;//取文件二的长度if(size1==0&&size2||size2==0&&size1){cout两个文件的长度不同:endl;cout文件fcbp1-FileName的长度size1endl;cout文件fcbp2-FileName的长度size2endl;cout两文件在第一个字节处不同;returnfalse;}-8-while(s10&&s20){for(i=0;iSIZE;i++,j++){if(j==size1&&j==size2)break;Buffer1=Disk[s1][i];//读第一个文件内容Buffer2=Disk[s2][i];//读第二个文件内容if(Buffer1!=Buffer2)//比较{cout文件fcbp1-FileName长度为:size1endl;cout文件fcbp2-FileName长度为:size2endl;cout第一个不同字节的位置为第j+1个字节endl;cout此时两个文件的字符分别为Buffer1和Buffer2endl;returnfalse;}}if(iSIZE)break;//结束while循环,避免进入死循环}if(j==size1&&j==size2){cout两文件内容相同endl;cout文件长度为:size1;returntrue;}return1;}-9-返回开始命令格式是否正确文件二是否存在文件一是否存在是否仅其中一个为零是否均为最后一个字符内容是否相同取两个文件长度显示“两文件内容相同文件长度为:”读取文件内容并比较显示“要比较的文件不存在”返回文件长度,第一个不同字节的位置及具体值显示“要比较的文件不存在”返回文件长度,显示两个文件的长度不同:两文件在第一个字节处不同否否否否否否是是是是是是显示“命令格式错误”-10-4.修改del等命令,使其可以使用统配符*在经过前面几题的练习后对整个程序已经有了一定的了解,最后一个功能的修改基本是自己完成的。添加的程序段主要是通过判断命令中是否有“*”来决定是否执行添加的功能。以下是添加的程序段。/////////////////////////////////////////////////////////////////////增加的程序段if(comd[1][0]=='*'){s1=curpath.fblock;//当前目录的首块号保存于s1while(s10){p=(FCB*)Disk[s1];//p指向该目录的第一个盘块for(j=0;j4;j++,p++){ch=p-FileName[0];//取文件(目录)名的第一个字符if(ch==(char)0xe5)//空目录项continue;if(ch=='\0')//已至目录尾部break;if(p-Fattrib='\20')//是子目录continue;else{///////////////////////////////////////////////////////////////////////teststartFileName=p-FileName;//传递文件名s0=s1;s=FindFCB(FileName,s0,attrib,fcbp);//取FileName的首块号(查其存在性)if(s0){cout\n要删除的文件不存在。\n;return-2;}strcpy(gFileName,temppath);i=strlen(temppath);if(temppath[i-1]!='/')strcat(gFileName,/);strcat(gFileName,FileName);//构造文件的全路径名i=Check_UOF(gFileName);//查UOFif(iS)//该文件已在UOF中{cout\n文件gFileName正在使用,不能删除!\n;return-3;}attr=fcbp-Fattrib&'\01';-11-if(attr=='\01'){cout\n文件gFileName是只读文件,你确定要删除它吗?(y/n);cinyn;if(yn!='Y'&&yn!='y')continue;//不删除继续}i=PutUdtab(fcbp);//被删除文件的有关信息保存到udtab表中if(i0)//因磁盘空间不足,不能保存被删除文件的信息{cout\n你是否仍要删除文件gFileName?(y/n):;cinyn;if(yn=='N'||yn=='n')co