操作系统课程设计-文件系统目录管理_第1页
操作系统课程设计-文件系统目录管理_第2页
操作系统课程设计-文件系统目录管理_第3页
操作系统课程设计-文件系统目录管理_第4页
操作系统课程设计-文件系统目录管理_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文件治理系统目录文件治理的设计第一章课程设计目的和要求11课程设计目的12课程设计要求12.1课程设计思想原理 12.2课程题目12.3提交课程设计报告2第二章 课程设计内容 31文件治理系统结构32文件系统采用索引文件结构 32.1磁盘模拟32.2文件的逻辑结构32.3目录结构32.4用户接口 5第三章详细设计71程序功能模块图72实体关系图73数据流图84数据结构设计85 程序流程图 1.1.5.1建立文件目录(mkdir)程序流程图 1.15.2删除文件目录(rmdir)程序流程图 12第四章 程序运行与测试 131 程序运行主界面 132 用 mkdir dirname 命令创立子目录

2、 133用Is命令显示当前目录下信息 134 用rmdir dirname 命令删除子目录 145 用 cd dirname 命令改名当前目录 14第五章课程设计总结 16附录I参考文献17附录U程序清单 18第一章课程设计目的和要求1课程设计目的操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编 译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切.本课程设计的目的 综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和稳固操作系统根本理 论、原理和方法,掌握操作系统开发的根本技能.通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识 ,加深对教

3、材中 的重要算法的理解.同时通过编程实现这些算法 ,更好地掌握操作系统的原理及实现方法, 提升综合运用各专业课知识的水平.2课程设计要求2.1课程设计思想原理阅读操作系统方面的书籍,了解操作系统的文件系统原理.结合分析课程设计要求, 确定实体以及它们之间的关系.实体关系有三张表磁盘空间分配表、文件表、翻开文件表、 一个模拟磁盘的空间、命令效劳和用户构成.用户负责输入命令.命令效劳实现命令的解 释、命令检查以及调用相关模块执行相应的命令功能.磁盘空间分配表,采用链表结构,每个节点保存模拟磁盘的一个逻辑块的信息,包括 块的最大长度,文件占用长度,占用标志.如果占用标志为0,即该空间可分配给文件.初

4、始化磁盘空间分配表链表,首先把整个模拟磁盘作来一块,并置占用位为0.当有进程申请磁盘空间时,从头开始遍历,检查占用位,如果该块为可分配,那么检查块大小,假设块长 度大于或等于申请空间大小,那么把块的前一局部等于申请大小分配给文件,并置标志 位为占用.剩下的大小作来一个新块,作来一个新节点插入到原节点的后边,标志位为可 用.这样就实现了模拟磁盘的线性分配.构造这些实体的关系图,数据流图、程序流程图来进行具体的设计.2.2课程题目要求设计一个文件系统目录模拟程序,通过该程序能够实现简单的目录治理操作:创立多级目录 设计树型目录结构,能够从根目录开始创立树状的多级子目录.删除子目录 实现删除当前目录

5、下的子目录操作.显示当前目录下信息 能够实现显示当前目录下子目录及文件信息的操作.更改当前目录 通过操作可以改变当前目录,返回上级目录或进入下级子目录.在目录下创立文件 能够在目录下实现创立文件的操作.2.3提交课程设计报告在规定的时间完成课程设计各阶段的任务,最后提交详细的课程设计报告.第二章 课程设计内容1文件治理系统结构文件的逻辑结构文件的物理结构目录结构磁盘分配回收文件的保护用户接口2文件系统采用索引文件结构2.1磁盘模拟磁盘是断电后内容不丧失的,因此用文件模拟磁盘.要求模拟系统存在两块硬盘:用一个文件FAT1模拟磁盘c磁盘的每个盘块512字节,模拟磁盘共有128块.磁盘中第0块存放专

6、用块内容,第1、2块存放根目录,其余存放子目录和文件 2.2文件的逻辑结构文件的逻辑结构采用流式结构;文件的内容均采用文本文件,系统中有两种文件:一种是存放任意字符的文件一种是可执行文件:可执行文件的内容就是系统内进程的程序体.2.3目录结构目录结构采用树型目录结构.2.3.1目录项内容16个字节:目录名、文件名:6个字节;扩展名:3个字节可执行文件扩展名为exe,目录没有扩展名;目录、文件属性:1字节;文件长度:2字节目录没有长度,字节数.地址:直接地址项1个,一级索引项1个;预留1字节232根目录根目录位置固定,占用磁盘 2块,大小固定,共16项,占用模拟磁盘第1、2块;2.3.3子目录位

7、置不固定,大小不固定至少建立一级子目录,最好支持多级子目录.2.3.4磁盘分配磁盘的分配采用混合索引结构的分配方式.系统采用成组链接法记录磁盘空间的使 用情况.空闲块每组登记10个空闲块,专用块占用第0块.图2-1文件系统目录映射方式2.4用户接口用户接口提供用户接口操作命令,要求实现以下命令: 创立目录:mkdir dirname在当前目录下建立子目录,假设有同名文件夹存在或目录已满,那么程序进行提示, 并拒绝创立.(2) 删除目录:rmdir dirname在删除目录前,系统要求用户进行确认删除(3) 显示当前目录下信息:Is输入Is命令后,系统会显示当前目录下所有子目录和文件的信息,包括

8、文件名,文件类型等信息(4) 改变当前目录:cd dirname通过该命令可改变当前目录,进入上级目录或下级子目录(5) 创立文件:create 在目录下创立一个文本文件文件2.5屏幕显示屏幕显示要求包括:(1) 用户命令接口,用于系统运行时用户输入命令;(2) 磁盘目录显示,要求显示磁盘的树型目录结构;(3) 磁盘使用情况,显示磁盘每一个磁盘块的空间是否空闲第三章详细设计1程序功能模块图文件系统提供的目录操作有建立目录mkdir、删除目录rmdir、显示目录下内容Is、 改变当前目录cd、创立文件create.可以通过键盘输入命令来模拟文件的操作. 通过exit 命令退出程序.图3-1模拟文

9、件系统模块图2实体关系图图3-2冥体矢系图命令效劳使得用户能够输入命令,在需要时提供命令的帮助.同时能够分析命令,调 用相应的命令模块对模拟磁盘、磁盘空间分配表、文件表、翻开文件表进行操作.磁盘空 间分配表记录模拟磁盘的使用情况.文件表记录文件的信息和在磁盘里的位置等信息.打 开文件表记录已翻开的文件,对应文件表中的文件信息,和文件表里的文件节点类似,记 录了文件在模拟磁盘中的信息.3数据流图图3-3数据荷图4数据结构设计通过分析课程设计要求,具体设计出如下数据结构(1)定义常量const char* = "C:myfiles"盘块大小const int BlockSize

10、 = 512;/const int BlockCou nt = 128; /盘块数磁盘大小目录文件的最多FCE数const int DiskSize = BlockSize*BlockCou nt; /const int BlockFcbCou nt= BlockSize/sizeof(FCB);通过定义常量确定模拟文件系统磁盘的路径,以及文件块的大小,盘块数,以及分配 的磁盘大小和目录文件的最多文件限制块(FCB)数目.(2) 文件限制块结构体定义struct FCB / 文件限制块char fname16; / 文件名char type; /文件类型int size; /文件大小int f

11、atherBlockNum; /父目录块号in t curre ntBlockNum; /当前的盘块void chushihua()strcpy(fname,"O");type = NULL;size =0;fatherBlockNum = curre ntBlockNum = 0;通过结构体类型定义了文件限制块,文件限制块包括文件名,文件类型,文件大小,父目录块号,以及当前盘块,并且对文件限制块进行了初始化操作.文件限制块用来对文 件进行治理.(3) 目录文件结构struct dirFilestruct FCB fcbBlockFcbCou nt;voidinit(int

12、_FatherBlockNum,int _CurrentBlockNum,char *name) 父块号,当前块号,目录名strcpy(fcb0.fname,name); /本身的 FCB fcb0.fatherBlockNum=_FatherBlockNum; fcbO.curre ntBlockNum=_Curre ntBlockNum;fcb0.type=DIRECTORY; /标记目录文件for(int i=1;i<BlockFcbCount;i+)fcbi.fatherBlockNum=_Curre ntBlockNum; /标记为子项fcbi.type=NULL; /标记为空

13、白项;该结构体定义了目录文件结构,目录文件采用FCB吉构体数组方式进行组织治理,用来存储新创立的目录,把目录的相关信息保存在文件限制块结构体中.(4) 磁盘结构体定义struct DISKint FAT1BlockCou nt; /FAT1int FAT2BlockCount; /FAT2struct dir; /根目录char dataBlockCou nt-3BlockSize;void format()memset(FAT1,0,BlockCou nt);/FAT1memset(FAT2,0,BlockCou nt);/FAT2FAT10=FAT11=FAT12=-2; 0,1,2盘块号

14、依次代表 FAT1,FAT2,根目录区FAT20=FAT21=FAT22=-2; /FAT作备份root.i ni t(2,2,"C:");根目录区memset(data,0,sizeof(data);数据区;用文件模拟磁盘.要求模拟系统存在两块硬盘:用一个文件FAT1模拟磁盘c磁盘的每个盘块512字节,模拟磁盘共有128块.磁盘中第0块存放专用块内容,第1、2块存放根目录,其余存放子目录和文件5程序流程图5.1建立文件目录mkdir程序流程图查询文件表在文件表中登记在翻开文件耒中登记图3-4 mkdir程序流程图5.2删除文件目录(rmdir)程序流程图图3-5 rmdi

15、r 程序流程图1程序运行主界面第四章程序运行与测试-一-飲迎进人:r件养统撲抱程庁IMMJ4M K- 44 MMMM3KK#G M-MMffiH H-MK M MM M M-M M-HM-M M-4C M*LM>frM M-M M4«M K-M M-1=1录肯理 nJcdir 尸phT 11* la ed応4芒土甲Ldirname1 r(l 1 wiiFiw J Ldirnanc1 fd 1 vofhme If ll.-r.anii- 1:向建了日录:删隆寺昼盘;耳不吗迓自莖下储息:更改当討目亲:刨建斯文件防濫£獰蒙壽示務苛访薛轩碟7貫图4-1程序主界面2用mkdir

16、 dirname命令创立子目录加载文件系统成功,可以逬行操作G = 5kd iv nyf zi Le图4-2 mkdir命令运行结果3用Is命令显示当前目录下信息C = zbIccILk* pi*o Jacl-C 3 Xis: riil£ 1_L& 1>1'O该冃录下共有 0 个文本文件 K 个文件庚图4-3 Is命令运行结果4用rmdir dirname命令删除子目录通过执行该命令可以看到,假设删除的子目录不存在,系统将给出提示.Ilsproject该目录下井有0个文本文件 2个文件夹C:la* nyf i les当前目录下不存在该子目录FC : yiTidi

17、l* ray t ilsC: lsproject文件夹.该目录下共有0 $文本文件.1个文件夹图4-4 rmdir命令运行结果5用cd dirname命令改名当前目录通过该图可看到当前目录已从C:变为C:project ,命令执行成功C = lsproject文件夹.该目录下井有0个文本文件.1个文件夹C:Xcd projectC:pro ject图4-5 cd命令运行结果|C: c<l projectR? IJ*c t jc 1* atk;: Xpa*oJect Xis£1文本文件-肚目求卜共有1个文本文件.0个文件夹第五章课程设计总结通过本次的课程设计,使我能够正确运用操作

18、系统课程中所学的根本理论和知识,加 深了对文件系统根本概念的理解,以及磁盘文件系统的文件操作.还有让我感受挺深的是 对软件工程方法的应用.设计一个软件,先要做好需求分析,这一点很重要,如果没有分 析好需求,到软件设计的最后,发现所做的功能不符合要求,那么一切都得重做,前面所 有的努力都付诸东流.还有比拟重要的是,写好 E-R图,至少画出语境级的数据流图,以 及仔细画好程流程图.在程序设计的开始,由于分析工作做得不够深入和细致,吃了点小 苦头.对于这样一个小设计来说,都会吃苦头,要是大工程更是无法想像,有可能会工程 失败.以后得增强对软件工程的学习.另外在运用 C语言的时候,感觉有点生疏,在组织

19、 语言时时而出错,在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都 可以从相关资料中找到解决方法,有些问题是无法预料到的,这就需要通过自己理性的分 析得出问题的解决方案.在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题.在对 自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知 识,同时在编程时用到了模块化的设计思想, 这种编程方法可以使我们的编程变的更简单, 可以使我们的查错与纠错变的更方便.总的来说通过这次的设计的学习使我学到了很多在 平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣, 我想我会在这条路

20、上继续前进下去.我相信,只要不断的严格要求自己,注意培养自己的 思维水平,就一定会有更大更辉煌的开展和提升.附录I参考文献1 张尧学等编著计算机操作系统教程北京:清华大学出版社,2006.022 汤子瀛等编著.计算机操作系统.西安:西安电子科技出版社,1996.123 陈向群 编著.操作系统教程.北京:北京大学出版社,2007.014 罗宇 等编著.操作系统课程设计北京:机械工业出版社,2005.9int files; II当前翻开文件数附录n程序清单#in elude <stdio.h>#in elude <memory.h>#in elude <stri ng

21、>#i nclude <iostream>using n amespaee std;#defi ne GENERAL 1 /普通文件#defi ne DIRECTORY 2 /目录文件#defi ne NULL 0 / 空文件struct FCB / 文件限制块char fname16; / 文件名char type; II文件类型int size; II文件大小int fatherBlockNum; II父目录块号int curre ntBlockNum; II当前的盘块void chushihua()strcpy(fname,"O");type = N

22、ULL;size =0;fatherBlockNum = curre ntBlockNum = 0; ;II定义常量const char* = "C:myfiles"con st i nt BlockSize = 512;IIcon st i nt OPEN_MAX = 5;IIcon st i nt BlockCou nt = 128; II盘块大小能翻开最多的文件数 盘块数con st i nt DiskSize = BlockSize*BlockCou nt; II磁盘大小con st i nt BlockFcbCou nt = BlockSizeIsizeof(FC

23、B);II目录文件的最多FCB数int Open = 0;struct OPENLIST II用户文件翻开表FCB fOPEN_MAX; FCB复制OPENLIST()5for(i nt i=0;i<OPEN_MAX;i+)fi.fatherBlockNum=-1;为分配翻开fi.type=GENERAL;/目录文件结构struct dirFilestruct FCB fcbBlockFcbCou nt;void in it(i nt _FatherBlockNum,i nt _Curre ntBlockNum,char *n ame)父块号,当前块号,目录名strcpy(fcb0.fn

24、ame,name); /本身的 FCBfcb0.fatherBlockNum=_FatherBlockNum;fcb0.curre ntBlockNum=_Curre ntBlockNum;fcb0.type=DIRECTORY; /标记目录文件for(int i=1;i<BlockFcbCount;i+)fcbi.fatherBlockNum=_Curre ntBlockNum; /标记为子项fcbi.type=NULL; /标记为空白项;struct DISKint FAT1BlockCou nt;FAT1int FAT2BlockCou nt;FAT2struct dir; /根目

25、录char dataBlockCou nt-3BlockSize;void format()memset(FAT1,0,BlockCou nt); FAT1memset(FAT2,0,BlockCou nt); /FAT2FAT10=FAT11=FAT12=-2; 0,1,2盘块号依次代表 FAT1,FAT2,根目录区FAT20=FAT21=FAT22=-2; /FAT作备份root.i ni t(2,2,"C:");根目录区memset(data,0,sizeof(data);数据区;/全局变量FILE *fp; /磁盘文件地址char * BaseAddr; /虚拟磁盘

26、空间基地址stri ng curren tPath="C:" /当前路径int curren t=2; /当前目录的盘块号stri ng cmd; /输入指令struct DISK *osPoi nt; /磁盘操作系统指针char comma nd16; /文件名标识struct OPENLIST* ope nlist; /用户文件列表指针/函数声明int format();int mkdir(char *son fname);int rmdir(char *son fname);int create(char *n ame);int listshow();int cha

27、ngePath(char *son fname);int exit();/系统初始化int format()curre nt = 2;curren tPath="C:" /当前路径osPoi nt->format();翻开文件列表初始化delete ope nlist;ope nlist=new OPENLIST;/* 保存到磁盘上 my*/fp = fopen(, "w+");fwrite(BaseAddr,sizeof(char),DiskSize,fp); fclose(fp);printf(nn );return 1;/创立子目录int m

28、kdir(char *son fname)/判断是否有重名/寻找空白子目录项/寻找空白盘块号/当前目录下增加该子目录项/分配子目录盘块,并且初始化/ 修改fat表int i,temp,iFAT;struct dirFile *dir; /当前目录的指针if(curre nt=2)dir =&( osPo in t->root);elsedir=(struct dirFile *)(osPo in t->data curre nt-3);/为了防止该目录下同名文件夹for(i = 1;i<BlockFcbCou nt;i+)if(dir->fcbi.type=DI

29、RECTORY && strcmp(dir->fcbi.fname,sonfname)=0 ) prin tf("该文件夹下已经有同名的文件夹存在了!n");return 0;/查找空白fcb序号for(i=1;i<BlockFcbCou nt;i+)if(dir->fcbi.type=NULL)break;if(i=BlockFcbCou nt)printf("该目录已满!请选择新的目录下创立!n");return 0;temp=i;for(i = 3;i < BlockCou nt;i+)if(osPoi nt

30、->FAT1i = 0)break;if(i = BlockCou nt)磁盘已满!n");printf("return 0;iFAT=i;/接下来进行分配osPoi nt->FAT1iFAT=osPoi nt->FAT2iFAT = 2; 112表示分配给下级目录文件/填写该分派新的盘块的参数strcpy(dir->fcbtemp.fname,s on fname);dir->fcbtemp.type=DIRECTORY;dir->fcbtemp.fatherBlockNum=curre nt;dir->fcbtemp.curre

31、 ntBlockNum=iFAT;/初始化子目录文件盘块dir=(struct dirFile*)(osPoi nt->data iFAT-3); /定位到子目录盘块号dir->i nit (curre nt,iFAT,so nfname);/iFAT是要分配的块号,这里的curre nt 用来指要分配的块的父块号printf(nn");return 1;/删除当前目录下的文件夹int rmdir(char *son fname)int i,temp,j;/保证当前目录下有该文件,并记录下该FCB下标struct dirFile *dir; /当前目录的指针if(curr

32、e nt=2)dir =&( osPo in t->root);elsedir=(struct dirFile *)(osPo in t->data curre nt-3);for(i=1;i<BlockFcbCou nt;i+)/查找该目录文件if(dir->fcbi.type=DIRECTORY && strcmp(dir->fcbi.fname,so nfname)=0) break;temp=i;if(i=BlockFcbCou nt)printf(当前目录下不存在该子目录!n");return 0;j = dir->

33、;fcbtemp.curre ntBlockNum;struct dirFile *so nDir; /当前子目录的指针sonDir=(struct dirFile *)(osPoint->data j - 3);查找子目录是否为空目录for(i=1;i<BlockFcbCount;i+) / if(son Dir->fcbi.type!=NULL)/printf(return 0;该文件夹为非空文件夹,为保证平安,请清空后再删除!n");删除子目录osPoi nt->FAT1j = osPoi nt->FAT2j=0; char *p=osPoi nt

34、->dataj-3; / memset(p,0,BlockSize);dir->fcbtemp.chushihua(); printf("return 1;/fat清空格式化子目录/回收子目录占据目录项-nn");/查询子目录int listshow()int i,DirCou nt=O,;/ 搜索当前目录struct dirFile *dir; /当前目录的指针if(curre nt=2)dir =&( osPo in t->root);elsedir=(struct dirFile *)(osPo in t->data curre nt-

35、3);for(i=1;i<BlockFcbCou nt;i+)if(dir->fcbi.type=GENERAL) /查找普通文件文本文件.n",dir->fcbi.fname);5prin tf("%sif(dir->fcbi.type=DIRECTORY) /查找目录文件DirCou nt+;printf("%s文件夹.n",dir->fcbi.fname);printf("n 该目录下共有 %d个文本文件,%d个文件夹nn",);printf("nn");return 1;/进入

36、当前目录下的子目录int cha ngePath(char *son fname)struct dirFile *dir; /当前目录的指针if(curre nt=2)dir =&( osPo in t->root);elsedir=(struct dirFile *)(osPo in t->data curre nt-3);/* 回到父目录*/if(strcmp(s on fname,".")=0)if(curre nt=2)prin tf("你现已经在根目录下!n");return 0;curre nt = dir->fcb

37、0.fatherBlockNum ;curre ntPath=curre ntPath.substr(O,curre ntPath.size()strlen(dir->fcb0.fname )-1);return 1;/* 进入子目录*/int i,temp;/保证当前目录下有该目录,并且记录下它的FCB下标for(i = 1; i < BlockFcbCount; i+)/查找该文件if(dir->fcbi.type=DIRECTORY && strcmp(dir->fcbi.fname,sonfname)=0 )temp=i;break;if(i=BlockFcbCou nt)printf("不存在该目录!n");return 0;/修改当前文件信息curre nt=dir->fcb temp.curre ntBlockNum ;curre ntPath = curre ntPath+dir->fcb temp.fname +""printf(nn");retur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论