试验四文件系统一、实验目的1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。2、要求设计一个n个用户的文件系统,每次用户可以保存M个文件。用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。二、实验题目:采用二级目录结构实现磁盘文件操作。要求:1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。2.目录文件的目录项包括目录名,指向下一级目录块的指针内容。假定每个目录文件最多只能占用一个块;3.程序功能方面的要求:需要实现一个命令行操作界面,包含如下命令:4.程序实现方面的要求:(1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但是程序不得因此而退出。(2)、界面友好,程序强壮。(3)、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致。不要自己设计命令或者附加不要求的功能。三.实验源程序文件名:Filesystem_s.cpp执行文件名:Project1.exe四.实验分析1)总论:该系统是一个多用户、多任务的实时操作系统。对用户和用户的文件数目并没有上限。也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。该系统的操作命令如下:①、bye-用户注销命令。当使用该命令时,用户退出系统。命令格式:run\bye↙系统注销该用户并回到登陆界面。②、close-删除用户注册信息命令。执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。命令格式:run\close↙.完成后返回登陆界面。③、create-在当前目录下创建一个文件,且该文件不能跟系统中的文件重名。该文件的管理信息登录到用户文件信息管理模块中。命令格式:run\createfile1↙。其中file1为要创建的文件名称。执行完该命令后回到执行命令行。④、delete-删除当前用户目录下的一个文件。命令格式:run\deletefile1↙。返回命令行。⑤、list-显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。命令格式:run\list↙。⑥、chmod-改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。命令格式:run\chmodfile1↙。⑦、open-在window界面下打开某个文件。命令格:run\openfile1↙。执行该命令后,文件file1将用在windows界面下的文件形式打开。用户可以在这个方式中对文件进行修改,并将修改后的内容保存。⑧、read-读文件信息。将文件信息读入并显示在终端。命令格式:run\readfile1↙。⑨、write-向某个文件写入新的信息。用户可以选择用覆盖原来内容的方式和在文件的末尾插入新信息的方式写入信息。2)_系统采用二级文件目录。设置主目录(MFD)和用户文件目录(UFD),分别以文件的方式保存在磁盘中。在主目录中又注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。用户文件目录用用户名作为文件名保存在磁盘,以便检索时方便对应。在用户文件目录中保存着该目录下所有的文件的文件名称、保护码、文件长度。3)该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建写入、读出、删除等效果。4)实验流程图开始选项用户登录新用户注册退出程序结束在MFD中找到该用户?初始化命令关键字(keyword)显示该用户目录下的所有文件管理信息15)源程序:#includeiostream.h#includestdio.h#includestdlib.h#includestring.h#includeconio.h#includedos.h#defineNULL0#definekeynum10#definegetspace(type)(type*)malloc(sizeof(type))charcmd[64];//存放用户输入命令charbuffer[36];//charuser[32];//存放当前登陆的用户名typedefcharALFA[12];ALFAKWORD[keynum];1创建文件删除文件打开文件读文件写文件改变权限显示文件保存当前主目录删除用户返回主界面输入命令structUFD{//用户文件管理模块charfilename[32];//文件名intsafecode;//文件保护码longlength;//文件长度}*curfile=NULL;structMFD{//用户登陆信息管理模块charusername[32];//用户名boolfilepoint;//用户目录下的文件指针,false表示目录为空}*curuser=NULL,*elseuser=NULL;typedefUFDUFD;typedefMFDMFD;voidmain();voidKeyWord()//初始化命令关键字{strcpy(KWORD[1],bye);strcpy(KWORD[2],chmod);strcpy(KWORD[3],close);strcpy(KWORD[4],create);strcpy(KWORD[5],delete);strcpy(KWORD[6],list);strcpy(KWORD[7],open);strcpy(KWORD[8],read);strcpy(KWORD[9],write);}intLoginDisplay()//登陆选项操作函数{intSELETE_1=0;do{cout*****请选择操作*****\n1、用户登陆2、用户注册0、退出endl;cinSELETE_1;}while(SELETE_10||SELETE_12);system(cls);returnSELETE_1;}boolLogin(intSELETE)//用户登陆,注册函数{FILE*fp,*fp1,*fp2;charname[12];switch(SELETE){case1://用户登陆if((fp=fopen(LOGIN.exe,rb))==NULL)//打开用户注册目录管理文件{cout\n错误:不能打开登陆文件。endl;getch();system(cls);returnfalse;}curuser=getspace(MFD);cout\n*****登陆*****\n用户名:;cinname;//输入用户登陆名while(!feof(fp))//检查该用户是否合法{fread(curuser,sizeof(MFD),1,fp);if(strcmp(curuser-username,name)==0)break;}if(feof(fp))//如果没有找到跟当前登陆用户名相同的管理信息,提示出错{cout\n错误:该用户不存在。endl;fclose(fp);returnfalse;}else{fclose(fp);returntrue;}break;case2://新用户注册if((fp=fopen(LOGIN.exe,ab))==NULL)//如果登陆信息管理文件不存在fp=fopen(LOGIN.exe,wb+);//创建该信息管理文件charname[12];curuser=getspace(MFD);while(1){cout\n*****新用户注册*****endl;cout用户名:;cinname;//输入用户注册名fp1=fopen(LOGIN.exe,rb);while(!feof(fp1))//查看该用户名是否被别的用户占用{fread(curuser,sizeof(MFD),1,fp1);if(strcmp(curuser-username,name)==0)//该名称已经被使用{cout\n该用户已经存在,请重新输入!endl;getch();break;}}if(feof(fp1))//该名称没有被别的用户占用{strcpy(curuser-username,name);curuser-filepoint=NULL;fwrite(curuser,sizeof(MFD),1,fp);strcpy(user,curuser-username);//生成用户文件管理模块strcat(user,.exe);//用于管理用户目录下的各个文件fp2=fopen(user,wb+);fclose(fp2);cout\n注册成功!endl;//提示注册成功fclose(fp1);fclose(fp);break;}}fp=fopen(LOGIN.exe,rb);//显示当前注册用户的名称while(1){fread(curuser,sizeof(MFD),1,fp);if(feof(fp))break;coutcuruser-usernameendl;getch();}fclose(fp);returntrue;break;default:returnfalse;break;}}voidDisplayUFD()//打印用户信息,包括用户的各个文件//名称、长度和操作权限的设置信息{if(curuser-filepoint==false)//当前用户目录下没有任何文件存在cout\n用户curuser-username文件夹是空的endl;else{//存在文件,将所有文件信息打印在终端FILE*fp;charfilename[12];strcpy(filename,curuser-username);strcat(filename,.exe);if((fp=fopen(filename,rb))==NULL)//打开用户文件信息管理模块{cout\n无法打开用户:curuser-username的文件!endl;getch();return;}else{//读入并将用户全部文件信息打印在终端cout用户:curuser-username目录下的文件:endl;UFD*ufd;inti=0;ufd=getspace(UFD);//申请存放用户文件模块的空间while(1){fread(ufd,sizeof(UFD),1,fp);if(feof(fp))//全部输出完毕,结束break;else//打印信息coutufd-filename\tufd-length\tufd-safecodeendl;}}fclose(fp);}}voidByeFile(boolBOOL)//注销函数,调用次函数用户可以退出系统{FILE*infile,*outfile;charout[50];strcpy(out,outfilelocate.exe);if((infile=fopen(LOGIN.exe,rb))==NULL){cout\n保存错误。;//fclose(infile);return;}else{if((outfile=fopen(out,wb+))==NULL)//申请一个缓冲区管理模块//存放用户更新后的全部信息{cout\n保存错误。;//fclose(outfile);fclose(infile);return;}else{MFD*mfd=getspace(MFD);while(1){//将旧文件管理信息读出,并保存到新的文件信息管理模块中fread(mfd,sizeof(MFD),1,infile);if(feof(infile))break;if((strcmp(mfd-username,curuser-username))==0){if(BOOL)//更新当前用户信息的操作fwrite(curuser,sizeof