文件系统设计.doc
文件系统设计1文件系统下列几条命令LOGIN用户登陆DIR列文件目录CREATE创建文件DELETE删除文件OPEN打开文件CLOSE关闭文件READ读文件WRITE写文件列目录时要列出文件名,物理地址,保护码和文件长度。源文件可以进行读写保护。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2并以编号作为物理地址,在目录中进行登记。程序见下(本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录):#include"stdio.h"#include"string.h"#include"conio.h"#include"stdlib.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);*/charfnameMAXNAME;/*filename*/OSFILE;typedefstruct/*thestructureofOSUFD*/charufdnameMAXNAME;/*ufdname*/OSFILEufdfileMAXCHILD;/*ufdownfile*/OSUFD;typedefstruct/*thestructureofOSUFDLOGIN*/charufdnameMAXNAME;/*ufdname*/charufdpword8;/*ufdpassword*/OSUFD_LOGIN;typedefstruct/*fileopenmode*/intifopen;/*ifopen:0-close,1-open*/intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/OSUFD_OPENMODE;OSUFD*ufdMAXCHILD;/*ufdandufdownfiles*/OSUFD_LOGINufd_lp;intucount=0;/*thecountofmfdsufds*/intfcountMAXCHILD;/*thecountofufdsfiles*/intloginsuc=0;/*whetherloginsuccessfully*/charusernameMAXNAME;/*recordloginusersname22*/chardirnameMAXNAME;/*recordcurrentdirectory*/intfpaddrnoMAX;/*recordfilephysicaladdressnum*/OSUFD_OPENMODEifopenMAXCHILDMAXCHILD;/*recordfileopen/close*/intwgetchar;/*whethergetchar()*/FILE*fp_mfd,*fp_ufd,*fp_file_p,*fp_file;voidmain()inti,j,choice1;charchoice50;/*choiceoperation:dir,create,delete,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:osfilemfd","rb")=NULL)fp_mfd=fopen("c:osfilemfd","wb");fclose(fp_mfd);for(i=0;i<MAX;i+)fpaddrnoi=0;textattr(BLACK*16|WHITE);clrscr();/*clearscreen*/LoginF();/*userlogin*/clrscr();if(loginsuc=1)/*LoginSuccessfully*/while(1)wgetchar=0;if(choiceend=1)printf("nnC:%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("nTheCommandListn");printf("nCdAttribCreatModifyReadOpenClsDeleteExitClosen");char*rtrim(char*str)/*removethetrailingblanks.*/intn=strlen(str)-1;while(n>=0)if(*(str+n)!=)*(str+n+1)=0;break;elsen-;if(n<0)str0=0;returnstr;char*ltrim(char*str)/*removetheheadingblanks.*/char*rtrim(char*str);strrev(str);rtrim(str);strrev(str);returnstr;voidLoginF()/*LOGINFileSystem*/charloginameMAXNAME,loginpw9,logincpw9,str50;inti,j,flag=1;chara25;intfindout;/*loginusernotexist*/