您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 操作系统课程设计二级文件系统
专业:计算机信息处理学号:08201328姓名:杨馨雨提交日期:2011-7-14操作系统课程设计报告操作系统课程设计报告1【设计目的】1.课程设计目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。2.结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。3.通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】1、delete删除文件2、open打开文件3、close关闭文件4、write写文件【实验环境】Windows7系统Visualstudio2010【相关知识综述】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。【设计思路】1主要数据结构#defineMAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#defineMAXCHILD50/*thelargestchild每个用户名下最多有50个文件*/#defineMAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE定义主文件*/{intfpaddr;/*filephysicaladdress*/intflength;/*filelength*/intfmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/charfname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD定义用户文件目录*/{charufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN定义登陆*/{操作系统课程设计报告2charufdname[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;2主要函数voidLoginF();/*LOGINFileSystem*/voidDirF();/*DirFileSystem*/voidCreateF();/*CreateFile*/voidDeleteF();/*DeleteFile*/voidModifyFM();/*ModifyFileMode*/voidOpenF();/*OpenFile*/voidCloseF();/*CloseFile*/voidReadF();/*ReadFile*/voidWriteF();/*WriteFile*/voidQuitF();/*QuitFileSystem*/voidCdF();/*ChangeDir*/voidhelp();【主要程序段】1Delete函数voidDeleteF()/*DeleteFile*/{charfname[MAXNAME],str[50],str1[50];inti,k,j;intfpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),)==0)/*无法删除主目录的文件*/{printf(\nError.Pleaseconverttoufddirbeforedelete.\n);wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/{printf(\nError.Youcanonlymodifyfilemodeinyourselfdir.\n);wgetchar=1;}else{printf(\nPleaseinputFileName:);操作系统课程设计报告3gets(fname);//从键盘获取所要删除的文件名ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if(i=0){k=ExistD(username);if(ifopen[k][i].ifopen==1)/*文件打开时无法删除*/{printf(\nError.\'%s\'isinopenstatus.Closeitbeforedelete.\n,fname);wgetchar=1;}else{if(ufd[k]-ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf(\nError.\'%s\'isinprotectstatus.Closeitbeforedelete.\n,fname);wgetchar=1;}else{fpaddrno1=ufd[k]-ufdfile[i].fpaddr;//获取文件对应的物理文件名fpaddrno[fpaddrno1]=0;//回收盘块for(j=i;jfcount[k];j++){ufd[k]-ufdfile[j]=ufd[k]-ufdfile[j+1];//从被删除的文件号开始,数组值全部前移一个}strcpy(str,d:\\osfile\\file\\file);itoa(fpaddrno1,str1,10);//整数转化成字符串strcat(str,str1);strcat(str,.txt);remove(str);//删除物理文件fcount[k]--;//k用户文件数量少1printf(\n\'%s\'isdeletedsuccessfully.\n,fname);wgetchar=1;}}}else//所要删除的文件不存在{printf(\nError.\'%s\'dosenotexist.\n,fname);wgetchar=1;}}操作系统课程设计报告4}2Open函数voidOpenF()/*OpenFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*在自己的目录里才能打开*/{printf(\nError.Youcanonlyopeninyourselfdir.\n);wgetchar=1;}else{k=ExistD(username);for(j=0;jfcount[k];j++){printf(%15s,ufd[k]-ufdfile[j].fname);}printf(\nPleaseinputFileName:);gets(fname);//获取所要打开的文件名ltrim(rtrim(fname));i=ExistF(fname);//获取目录编号if(i=0){if(ifopen[k][i].ifopen==1)//输入的文件是打开的{printf(\nError.\'%s\'isinopenstatus.\n,fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;//修改为打开的if(ufd[k]-ufdfile[i].fmode==0)/*根据文件的模式设置打开模式*/{ifopen[k][i].openmode=0;}elseif(ufd[k]-ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}elseif(ufd[k]-ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}elseifopen[k][i].openmode=3;printf(\n\'%s\'isopenedsuccessfully\n,fname);wgetchar=1;}}操作系统课程设计报告5else//文件不存在{printf(\nError.\'%s\'dosenotexist.\n,fname);wgetchar=1;}}}3Close函数voidCloseF()/*CloseFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*不在自己的目录里没法进行*/{printf(\nError.Youcanonlyclosefileinyourselfdir.\n);wgetchar=1;}else{k=ExistD(username);for(j=0;jfcount[k];j++)/*列出已经打开的文件*/{if(ifopen[k][j].ifopen==1)//如果文件是打开的printf(%15s,ufd[k]-ufdfile[j].fname);}printf(\nPleaseinputFileName:);gets(fname);//从键盘上读入所要关闭的文件ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if(i=0){ifopen[k][i].ifopen=0;/*关闭文件*/printf(\n\'%s\'closedsuccessfully\n,fname);wgetchar=1;}else//所要关闭的文件不存在{printf(\nError.\'%s\'dosenotexist.\n,fname);wgetchar=1;}}}操作系统课程设计报告64Write函数voidWriteF()/*WriteFile*/{inti,k,n=0;intlength;charfname[MAXNAME],values[1000];charstr[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),)==0)//只能写自己目录下的文件{printf(\nError.Pleaseconverttoufddirbeforewrite.\n);wgetchar=1;return;}printf(\nCaution:Openfilefirst\n);printf(OpenedFile(s)List:\n);k=ExistD(dirname);//获取目录编号for(i=0;ifcount[k];i++)/*列出可以写的文件*/{if(ifopen[k][i].ifopen==1)//如果文件是打开的{printf(%15s,ufd[k]-ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0))printf(\n);}printf(\n%dfilesopenned.\n,n);if(n==0)wgetchar=1;//没有打开的文件if(n!=0){printf(\nPleaseinputFileName:);gets(fname);//从键盘获取所要写的文件ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if(i=0){if(ifopen[k][i].ifopen==1)//如果文件是打开的{if((ifopen[k][
本文标题:操作系统课程设计二级文件系统
链接地址:https://www.777doc.com/doc-6139956 .html