您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统课程设计实验报告
华南农业大学信息(软件)学院《操作系统》课程设计成绩单开设时间:2010学年第一学期专业计算机科学与技术班级3学号200830740315200830740318姓名林利民王广博实验题目题目五:模拟磁盘文件系统自我评价王广博:在这个实验里,我主要做出了整个项目的整体规划、GUI的设计、数据结构的设计以及部分方法的编写。在这个实验中,我感觉总体难度不是很大,关键方法只是利用递归实现目录树的分层,并没有让我真正学到一些新的知识,仅仅是在巩固已学过的知识。但我还是在这次实验中学会了如何更好地合作,我觉得对于这种小实验,如果一个人的话,也许会做得更快,但合作才是我们必须学会的东西。合作,就是要有一个比较厉害的人先站出来,规划好整个项目的流程,然后在出现分歧的时候,要有一个人作出最终的拍案,否则将在分歧点上停滞不前。在本次实验中,我更深刻地理解了磁盘管理文件的工作原理,其次就是将这学期学的软件工程加以应用。林利民:在设计与实现模拟磁盘文件系统的过程中,我学到了很多的知识。首先很重要的一点是在写程序之前一定要多次地去阅读题目的要求,要对具体的要求有较好的理解,心里对于程序的具体实现要有一定的想法,要有模块化的思想,设计从上到下,实现从下到上。我主要偏重于文件操作部分的编写设计,在实现上我从队友那里学到了很多。在图形界面上,我则给予队友小小的帮助,写了磁盘使用情况的显示,FAT表和已打开文件表的显示。总的来说这次的课程设计不是特别的困难,遇到的问题也不是特别地多,但是从中我学到了不少知识。教师评语评价指标:题目内容完成情况优□良中□差□对算法原理的理解程度优□良中□差□程序设计水平优□良中□差□实验报告结构清晰优□良中□差□实验总结和分析详尽优□良中□差□成绩94教师签名张丽霞实验报告一、需求分析这个程序主要通过模仿磁盘文件读取操作的过程,设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区。实现了以下功能:(1)支持多级目录结构,支持文件的绝对读路径。(2)文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式。(3)采用文件分配表:显示磁盘的使用情况。(4)实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。我们对要求的理解:1.文件的物理结构通过FAT表,选用链表分配。2.建立文件:从命令中得到文件名,建立文件。修改目录表。3.删除文件:回收文件占用的空间,修改目录表,模仿windows,删除文件时仅将文件占用空间回收,并没有将其内容致零。4.读文件:[文件名][显示的字节数],直接显示所需要的字节数。5.写文件:[文件名][插入的内容],按照指导书采用追加的方式6.查询属性:显示、修改文件属性,文件名,类型等。二、概要设计publicclassFAT{//publicstaticcharbad=254;//坏盘块的值publicstaticcharfree=0;//空闲盘块的值publicstaticcharroot=2;//根目录的块号publicstaticchartail=255;//文件结束的值publicstaticchar[]fat=newchar[128];//定义一个FAT表publicstaticvoidinit(){//程序初始化时,将FAT从磁盘文件中读出}publicstaticvoidwrite(){将FAT表写回磁盘文件}}publicclassMyFile{//目录项privateStringname;//文件名,长度为3个字节privateStringtype;//文件类型,长度为两个字节privatecharattribute;//文件属性,一个字节privatecharstart;//起始盘块号privatecharlength;//文件长度}publicclassOpenedFile{//文件打开表项privateStringfilePath;//文件路径privatecharattribute;//文件属性privatecharstart;//起始盘块号privatecharlength;//文件长度privatebooleanwriteAble;//打开方式privatecharreadBlockNum;//读文件块号privatecharreadBlockIndex;//读指针块内地址privatecharwriteBlockNum;//写文件块号privatecharwriteBlockIndex;//写指针块内地址}publicclassOpenedFileList{//文件打开表publicfinalstaticintmaxSize=5;//文件打开表最多能打开5项publicstaticListOpenedFileofl=newArrayListOpenedFile();//文件打开表}三、详细设计主要函数操作:底层块操作类:publicclassBlockOperator{publicfinalstaticintblockSize=64;//一个盘块64字节publicfinalstaticintnumberOfBlocks=128;//磁盘文件共有128个盘块publicstaticvoidinit(){//磁盘文件初始化if:已经存在磁盘文件模拟文件系统创建文件删除文件读取文件写入文件查询属性显示内容显示目录创建文件夹FAT表打开文件关闭文件已打开文件表将FAT表从磁盘文件中读出return;}新建一个磁盘文件byte[]b=newbyte[128*64];//创建一个大小为128*64字节的磁盘文件初始化FAT表内容Forifrom0to64:i+=8{b[2*64+i]='$';}将初始化内容写入磁盘文件}publicstaticchar[]read(intblockIndex){//读出指定盘块号的盘块内容byte[]b=newbyte[64];RandomAccessFileraf=newRandomAccessFile(disk,r);将读指针移动到要读取的盘块的首部将盘块的内容读出raf.close();将读到的盘块内容返回}publicstaticvoidwrite(char[]c,intblockIndex){//写入指定盘块号的内容byte[]b=changeToByte(c);RandomAccessFileraf=newRandomAccessFile(disk,rw);将写指针移动到要写的盘块的首部将内容写入盘块raf.close();}publicstaticintfindAvailableBlock(){//寻找空闲的盘块forifrom;toFAT.fat.length;i++{ifFAT.fat[i]==0:返回空闲块号}返回无空闲块}}文件操作类:publicclassMyFileOperator{publicstaticvoidcreateDirectory(Stringpaths,StringfileName,intblockIndex){//创建目录Stringpath=null;if(如果路径中“/”后还有目录){path=目录名paths=去掉path之后的路径}MyFile[]mf=read(blockIndex);//将父目录的盘块读出if(没有子目录){if(要创建的目录没有与之重名的){寻找空闲的目录项if(没有空闲的目录项){创建新的目录失败返回}寻找空闲的盘块if(没有空闲的盘块){创建新的目录失败返回}修改父目录的目录项将父目录写回盘块将新建的目录的目录项置为空并写入盘块修改FAT表}else{有重名的,不能创建}}else{寻找名为path的子目录if(有名为path的目录){createDirectory(paths,fileName,(int)mf[match].getStart());//向下递归}else{没有该目录,返回}}}publicstaticvoidcreateFile(StringabsolutePath,Stringpaths,StringfileName,Stringtype,charattribute,intblockIndex){//创建文件Stringpath=null;if(如果路径中“/”后还有目录){path=目录名paths=去掉path之后的路径}MyFile[]mf=read(blockIndex);//将父目录的盘块读出if(没有子目录){if(要创建的目录没有与之重名的){寻找空闲的目录项if(没有空闲的目录项){创建新的文件失败返回}寻找空闲的盘块if(没有空闲的盘块){创建新的目录失败返回}修改父目录的目录项将父目录写回盘块将新建的目录的8个目录项置为空并写入盘块修改FAT表以写方式填写文件打开表}else{有重名,不能创建}}else{寻找名为path的子目录if(有名为path的目录){createFile(absolutePath,paths,fileName,type,attribute,(int)mf[match].getStart());//继续向下递归}else{没有该目录,返回}}}publicstaticvoidopenFile(StringabsolutePath,Stringpaths,StringfileName,Stringtype,booleancanWrite,intblockIndex){//打开文件Stringpath=null;if(如果路径中“/”后还有目录){path=目录名paths=去掉path之后的路径}MyFile[]mf=read(blockIndex);//将父目录的盘块读出if(没有子目录){if(要创建的目录没有与之重名的){if(以写方式打开&&要打开的文件时只读文件){不能以写方式打开只读文件,返回}if(如果已打开文件表中已经存在该文件){不能打开已经存在的文件,返回}else{打开成功,填写已打开文件表}}else{不存在该文件,返回}}else{寻找名为path的子目录if(有名为path的目录){openFile(absolutePath,paths,fileName,type,canWrite,(int)mf[match].getStart());//往下递归}else{没有该子目录,返回}}}publicstaticvoidwriteFile(StringfilePath,Stringbuffer){//写文件在文件打开表中寻找要写的文件if(存在该文件){if(该文件不可以写){返回}intwriteIndex=文件的写指针的块内地址intwriteBlockNum=文件的写指针的块号charfileLength=文件长度char[]c=BlockOperator.read(writeBlockNum);//将要写入的盘块读出forifrom0tobuffer.length();i++{if(writeIndex=64){//一块写完了writeIndex=0;//写指针置0将已经写满的盘块写回磁盘文件c=newchar[64];//申请新块,寻找空闲的盘块修改FAT表修改写指针的块号fileLength++;//文件长度加1}c[writeIndex++]=buffer.charAt(i);//将buffer的内容写入盘块}Buffer的内容写完了,添加文件尾将盘块写回FAT.fat[writeBlockNum]=(char)-1;//修改FAT表将写指针的块号写回打开文件表将写指针的写指针写回已打开文件表将文件长度写回已打开文件表}else{没有该文件,返回}}publicstaticvoidcloseFile(StringfilePath){//关闭文件在文件打开表中寻找要写的文件if(存在该文件){intwriteIndex=文件的写指针的
本文标题:操作系统课程设计实验报告
链接地址:https://www.777doc.com/doc-3402668 .html