本科学生综合性实验报告课程名称:计算机操作系统项目名称:文件系统设计班级:计科0901班姓名:学号:指导教师:完成时间:2011年6月21日1.目的和要求本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。2.实验内容为DOS系统设计一个简单的二级文件系统。要求做到以下几点:①可以实现下列几条命令LOGIN用户登陆DIR列文件目录CREATE创建文件DELETE删除文件OPEN打开文件CLOSE关闭文件READ读文件WRITE写文件②列目录时要列出文件名,物理地址,保护码和文件长度。③源文件可以进行读写保护。3.实验环境操作系统:WINDOWSXP编译软件:WINTC4.程序设计(1)实验提示①本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。②首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。③用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。(2)主要数据结构a)OSFILE结点typedefstruct/*thestructureofOSFILE*/{intfpaddr;/*filephysicaladdress*/intflength;/*filelength*/intfmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite(default);*/charfname[MAXNAME];/*filename*/}OSFILE;b)OSUFD结点typedefstruct/*thestructureofOSUFD*/{charufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;c)用户密码typedefstruct/*thestructureofOSUFD'LOGIN*/{charufdname[MAXNAME];/*ufdname*/charufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;d)文件打开模式typedefstruct/*fileopenmode*/{intifopen;/*ifopen:0-close,1-open*/intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/}OSUFD_OPENMODE;e)i结点structdinode{unsignedshortdi_number;/*关联文件数*/unsignedshortdi_mode;/*存取权限*/unsignedshortdi_uid;unsignedshortdi_gid;unsignedlongdi_size;/*文件大小*/unsignedintdi_addr[NADDR];/*物理块号*/(3)主要函数a)登陆文件系统函数LoginF()b)目录操作函数DirF()c)改变当前目录函数CdF()d)创建文件函数CreateF()e)删除文件函数DeleteF()f)修改文件权限函数ModifyFM()g)打开文件函数OpenF()h)关闭文件函数CloseF()i)读文件函数ReadF()j)写文件函数WriteF()k)退出文件系统函数QuitF()l)帮助函数help();5.源代码参考程序见下(本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录):#includestdio.h#includestring.h#includeconio.h#includestdlib.h#defineMAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#defineMAXCHILD50/*thelargestchild*/#defineMAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE*/{intfpaddr;/*filephysicaladdress*/intflength;/*filelength*/intfmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite(default);*/charfname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD*/{charufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN*/{charufdname[MAXNAME];/*ufdname*/charufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode*/{intifopen;/*ifopen:0-close,1-open*/intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/}OSUFD_OPENMODE;OSUFD*ufd[MAXCHILD];/*ufdandufdownfiles*/OSUFD_LOGINufd_lp;intucount=0;/*thecountofmfd'sufds*/intfcount[MAXCHILD];/*thecountofufd'sfiles*/intloginsuc=0;/*whetherloginsuccessfully*/charusername[MAXNAME];/*recordloginuser'sname22*/chardirname[MAXNAME];/*recordcurrentdirectory*/intfpaddrno[MAX];/*recordfilephysicaladdressnum*/OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILD];/*recordfileopen/close*/intwgetchar;/*whethergetchar()*/FILE*fp_mfd,*fp_ufd,*fp_file_p,*fp_file;voidmain(){inti,j,choice1;charchoice[50];/*choiceoperation:dir,create,open,delete,modify,read,write*/intchoiceend=1;/*whetherchoiceend*/char*rtrim(char*str);/*removethetrailingblanks.*/char*ltrim(char*str);/*removetheheadingblanks.*/voidLoginF();/*LOGINFileSystem*/voidDirF();/*DirFileSystem*/voidCdF();/*ChangeDir*/voidCreateF();/*CreateFile*/voidDeleteF();/*DeleteFile*/voidModifyFM();/*ModifyFileMode*/voidOpenF();/*OpenFile*/voidCloseF();/*CloseFile*/voidReadF();/*ReadFile*/voidWriteF();/*WriteFile*/voidQuitF();/*QuitFileSystem*/voidhelp();if((fp_mfd=fopen(c:\\osfile\\mfd,rb))==NULL){fp_mfd=fopen(c:\\osfile\\mfd,wb);fclose(fp_mfd);}for(i=0;iMAX;i++)fpaddrno[i]=0;textattr(BLACK*16|WHITE);clrscr();/*clearscreen*/LoginF();/*userlogin*/clrscr();if(loginsuc==1)/*LoginSuccessfully*/{while(1){wgetchar=0;if(choiceend==1){printf(\n\nC:\\%s,strupr(dirname));}elseprintf(Badcommandorfilename.\nC:\\%s,strupr(username));gets(choice);strcpy(choice,ltrim(rtrim(strlwr(choice))));if(strcmp(choice,dir)==0)choice1=1;elseif(strcmp(choice,creat)==0)choice1=2;elseif(strcmp(choice,delete)==0)choice1=3;elseif(strcmp(choice,attrib)==0)choice1=4;elseif(strcmp(choice,open)==0)choice1=5;elseif(strcmp(choice,close)==0)choice1=6;elseif(strcmp(choice,read)==0)choice1=7;elseif(strcmp(choice,modify)==0)choice1=8;elseif(strcmp(choice,exit)==0)choice1=9;elseif(strcmp(choice,cls)==0)choice1=10;elseif(strcmp(choice,cd)==0)choice1=11;elseif(strcmp(choice,help)==0)choice1=20;elsechoice1=12;switch(choice1){case1:DirF();choiceend=1;break;case2:CreateF();choiceend=1;if(!wgetchar)getchar();break;case3:DeleteF();choiceend=1;if(!wgetchar)getchar();break;case4:ModifyFM();choiceend=1;if(!wgetchar)getchar();break;case5:choiceend=1;OpenF();if(!wgetchar)getchar();break;case6:choiceend=1;CloseF();if(!wgetchar)getchar();break;case7:choiceend=1;ReadF();if(!wgetchar)getchar();break;case8:choiceend=1;WriteF();if(!wgetchar)getchar();break;case9:printf(\nYouhaveexitedthissystem.);QuitF();exit(0);break;case10:choiceend=1;clrscr();break;case11:CdF();choiceend=1;break;case20:help();choiceend=1;break;default:choiceend=0;}}}elseprintf(\nAccessdenied.);}voidhelp(void){printf(\nTheCommandList\n);printf(\nCdAttribCreatModifyReadOpenClsDelet