您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 操作系统课程设计Linux二级文件系统设计
专业:软件工程学号:姓名:马提交日期:2017/1/10操作系统课程设计报告操作系统课程设计报告1【设计目的】1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现2、结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统3、通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】为Linux系统设计一个简单的二级文件系统。要求做到以下几点:1.可以实现下列几条命令:login用户登录dir列目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件cd进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护【实验环境】C++DevCpp【设计思路】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。结构体: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;//用户下面的文件操作系统课程设计报告2typedefstruct/*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;主要的函数说明:voidLoginF();/*LOGINFileSystem用户登录*/voidDirF();/*DirFileSystem列目录*/voidCdF();/*ChangeDir改变目录*/voidCreateF();/*CreateFile创建文件*/voidDeleteF();/*DeleteFile删除文件*/voidModifyFM();/*ModifyFileMode修改*/voidOpenF();/*OpenFile打开文件*/voidCloseF();/*CloseFile关闭文件*/voidReadF();/*ReadFile读文件*/voidWriteF();/*WriteFile写文件*/voidQuitF();/*QuitFileSystem离开文件系统*/voidhelp();其他重要函数:voidclrscr()//清屏intExistD(char*dirname)/*WhetherDirNameExist,Exist-i,NotExist-0*/intExistF(char*filename)/*WhetherFileNameExist,Exist-i,NotExist-0*/intFindPANo()/*findoutphysicaladdressnum*/voidSetPANo(intRorW)/*Setphysicaladdressnum,0-read,1-write*/voidInputPW(char*password)/*inputpassword,use'*'replace*/char*ltrim(char*str)/*removetheheadingblanks.去除左空白*/char*rtrim(char*str)/*removethetrailingblanks.去除右空白*/intWriteF1()/*writefile相当于置换文件*/操作系统课程设计报告3程序流程说明:整体流程:开始Login(Name/Pw/Cpw)创建文件打开文件写文件读文件删除文件关闭文件更改目录修改文件属性清屏退出系统添加覆盖结束操作系统课程设计报告4各部分功能流程:Open:NNY开始Open获取文件名文件是否存在?文件名不存在获取文件置为打开状态并获取文件模式打开文件成功结束操作系统课程设计报告5获取物理块号文件向前移动Delete:YNNYYN开始Delete主目录是否为空?确认删除文件在用户目录下!用户是否在用户目录下?只能修改用户目录下的文件!接收删除文件名获取文件文件被打开或被保打开或被保护状态不可删除删除文件,文件数减一删除文件成功!结束操作系统课程设计报告6确认该文件被打开覆盖0—追加,1—覆盖?Write:NYNY10开始Write用户是否在目录文件不存在!获取文件文件权限为只写或读文件为只读和保护,不允许写!获取路径追加文件写入成功!结束操作系统课程设计报告7Close:NYYN开始Close用户是否在目录请确认要关闭的文件是在用户目录下!罗列已经打开的文件获取文件名获取物理地址文件是否处于关闭状态?该文件已被关闭关闭文件文件成功关闭结束操作系统课程设计报告8【源程序清单】Open:voidOpenF()/*OpenFile*/{printf(\n\nC:\\%s,strupr(dirname));//显示当前路径intfcoun,i;//定义两个整形变量charfname[MAXNAME],fmode[25];//定义两个字符串变量intfmod;//文件模式printf(\nPleaseinputFileName:);gets(fname);//接收打开文件的文件名ltrim(rtrim(fname));//去除左右空白if(ExistF(fname)0)//判断文件是否存在{//不存在printf(\nError.文件名\'%s\'不存在\n,fname);wgetchar=1;}else{//存在i=ExistD(username);//获取用户物理信息for(inta=0;afcount[i];a++)//遍历用户文件{if(strcmp(fname,ufd[i]-ufdfile[a].fname)==0)//找到文件{fcoun=a;break;}}ifopen[i][fcoun].ifopen=1;//将文件状态置为打开状态printf(PleaseinputOpenMode(0-ReadOnly,1-WriteOnly,2-ReadandWrite,3-Protect):);//打开文件模式gets(fmode);//获取模式fmod=atoi(fmode);//将字符串转换为整型ifopen[i][fcoun].openmode=fmod;//将文件的模式置为OpenModeprintf(\nOpenSuccessed);wgetchar=1;}}Delete:voidDeleteF()/*DeleteFile*/{printf(\n\nC:\\%s,strupr(dirname));//显示路径charfname[MAXNAME],str[50],str1[50];//定义三个字符串变量inti,k,j;操作系统课程设计报告9intfpaddrno1;//记录文件物理地址块号if(strcmp(strupr(ltrim(rtrim(dirname))),)==0){//判断主目录是否为空printf(\nError.请确认您要删除的是否在用户目录下!\n);wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0){//判断用户是否在用户目录下printf(\nError.您只能删除修改自己用户目录下的文件哦!\n);wgetchar=1;}else{printf(\nPleaseinputFileName:);gets(fname);//接收删除的文件名ltrim(rtrim(fname));//去除文件名的左右空白i=ExistF(fname);//用户文件位置if(i=0){k=ExistD(username);//获取用户所在存储位置if(ifopen[k][i].ifopen==1){//文件状态处于打开状态,不许删除printf(\nError.\'%s\'处于打开状态!请先关闭哟!\n,fname);wgetchar=1;}else{if(ufd[k]-ufdfile[i].fmode==3){//保护文件,不可删除printf(\nError.\'%s\'处于被保护状态!请先关闭哟!\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];//将j+1位置为j}strcpy(str,c:\\osfile\\file\\);itoa(fpaddrno1,str1,10);//将整数转化为字符串strcat(str,str1);strcat(str,.txt);//连接remove(str);//删除物理文件fcount[k--];//文件个数减一printf(\n\'%s\'isdeletedsuccessfully.\n,fname);wgetchar=1;}}}else{printf(\nError.\'%s\'文件不存在!\n,fname);//文件不存在wgetchar=1;}操作系统课程设计报告10}}Write:voidWriteF()/*WriteFile*/{printf(\n\nC:\\%s,strupr(dirname));//显示用户路径inti,k,m=0;//定义整形变量intlength;//定义长度整形变量charfname[MAXNAME];//定义文件名字符串charstr[255],str1[255];//定义两个字符串变量if(strcmp(strupr(dirname),strupr(username))!=0){//判断用户是否在用户目录下printf(\nError!请确认您要写的在用户目录下!\n);wgetchar=1;return;}printf(\n请先打开文件!\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);m++;}if(m%4==0&&m!=0)//每创建4个文件换一行printf(\n);}printf(\n%d文件已经打开啦!\n,m);if(m==0)wgetchar=1;if(m!=0)//创
本文标题:操作系统课程设计Linux二级文件系统设计
链接地址:https://www.777doc.com/doc-5793024 .html