下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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.1 .1建立文件目录(mkdir)程序流程图 1.12 .2删除文件目录(rmdir)程序流程图 12第四章 程序运行与测试 131程序运行主界面 133 用 mkdir dirname
2、命令创建子目录 133用ls命令显示当前目录下信息 134 用rmdir dirname 命令删除子目录 145 用 cd dirname 命令改名当前目录 14第五章课程设计总结 16附录I参考文献17附录R程序清单 18第一章课程设计目的和要求1课程设计目的操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编 译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。本课程设计的目的 综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理 论、原理和方法,掌握操作系统开发的基本技能。通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知
3、识 ,加深对教材中 的重要算法的理解。同时通过编程实现这些算法 ,更好地掌握操作系统的原理及实现方法, 提高综合运用各专业课知识的能力。2课程设计要求2.1 课程设计思想原理阅读操作系统方面的书籍,了解操作系统的文件系统原理。结合分析课程设计要求, 确定实体以及它们之间的关系。实体关系有三张表(磁盘空间分配表、文件表、打开文件表)、 一个模拟磁盘的空间、命令服务和用户构成。用户负责输入命令。命令服务实现命令的解 释、命令检查以及调用相关模块执行相应的命令功能。磁盘空间分配表,采用链表结构,每个节点保存模拟磁盘的一个逻辑块的信息,包括块的最大长度,文件占用长度,占用标志。如果占用标志为0,即该空
4、间可分配给文件。初始化磁盘空间分配表链表,首先把整个模拟磁盘作来一块,并置占用位为0.当有进程中请磁盘空间时,从头开始遍历,检查占用位,如果该块为可分配,则检查块大小,若块长 度大于或等于申请空间大小,则把块的前一部分(等于申请大小)分配给文件,并置标志 位为占用。剩下的大小作来一个新块,作来一个新节点插入到原节点的后边,标志位为可 用。这样就实现了模拟磁盘的线性分配。构造这些实体的关系图,数据流图、程序流程图来进行具体的设计。2.2 课程题目要求设计一个文件系统目录模拟程序,通过该程序能够实现简单的目录管理操作: 创建多级目录 设计树型目录结构,能够从根目录开始创建树状的多级子目录 删除子目
5、录 实现删除当前目录下的子目录操作。 显示当前目录下信息 能够实现显示当前目录下子目录及文件信息的操作。 更改当前目录 通过操作可以改变当前目录,返回上级目录或进入下级子目录。 在目录下创建文件 能够在目录下实现创建文件的操作。2.3提交课程设计报告在规定的时间完成课程设计各阶段的任务,最后提交详细的课程设计报告。第二章 课程设计内容1文件管理系统结构 文件的逻辑结构 文件的物理结构 目录结构 磁盘分配回收文件的保护 用户接口2文件系统采用索引文件结构2.1 磁盘模拟磁盘是断电后内容不丢失的,因此用文件模拟磁盘。要求模拟系统存在两块硬盘: 用一个文件FAT1模拟磁盘c 磁盘的每个盘块512字节
6、,模拟磁盘共有128块。 磁盘中第0块存放专用块内容,第1、2块存放根目录,其余存放子目录和文件2.2 文件的逻辑结构文件的逻辑结构采用流式结构;文件的内容均采用文本文件,系统中有两种文件:一种是存放任意字符的文件一种是可执行文件:可执行文件的内容就是系统内进程的程序体。2.3 目录结构目录结构采用树型目录结构。2.3.1 目录项内容(16个字节): 目录名、文件名:6个字节; 扩展名:3个字节(可执行文件扩展名为exe,目录没有扩展名); 目录、文件属性:1字节; 文件长度:2字节(目录没有长度,字节数)。 地址:直接地址项1个,一级索引项1个; 预留1字节2.3.2 根目录根目录位置固定,
7、占用磁盘 2块,大小固定,共16项,占用模拟磁盘第1、2块;2.3.3 子目录位置不固定,大小不固定(至少建立一级子目录,最好支持多级子目录)。2.3.4 磁盘分配磁盘的分配采用混合索引结构的分配方式。系统采用成组链接法记录磁盘空间的使 用情况。空闲块每组登记10个空闲块,专用块占用第0块。索引块中每个盘块号占用 4字节,登记32块文件说明信息图2-1文件系统目录映射方式2.4用户接口用户接口提供用户接口操作命令,要求实现以下命令:(1)创建目录:mkdir dirname在当前目录下建立子目录,若有同名文件夹存在或目录已满,则程序进行提示, 并拒绝创建。(2)删除目录:rmdir dirna
8、me在删除目录前,系统要求用户进行确认删除(3)显示当前目录下信息:ls输入ls命令后,系统会显示当前目录下所有子目录和文件的信息,包括文件名,文件类型等信息(4)改变当前目录:cd dirname通过该命令可改变当前目录,进入上级目录或下级子目录(5)创建文件:create 口在目录下创建一个文本文件文件2.5屏幕显示屏幕显示要求包括:(1)用户命令接口,用于系统运行时用户输入命令;(2)磁盘目录显示,要求显示磁盘的树型目录结构;(3)磁盘使用情况,显示磁盘每一个磁盘块的空间是否空闲第三章详细设计1程序功能模块图文件系统提供的目录操作有建立目录(mkdir)、删除目录(rmdir)、显示目录
9、下内容(ls)、 改变当前目录(cd)、创建文件(create)。可以通过键盘输入命令来模拟文件的操作。 通过exit 命令退出程序。图3-1模拟文件系统模块图2实体关系图图3-2实体关系图命令服务使得用户能够输入命令,在需要时提供命令的帮助。同时能够分析命令,调 用相应的命令模块对模拟磁盘、磁盘空间分配表、文件表、打开文件表进行操作。磁盘空 间分配表记录模拟磁盘的使用情况。文件表记录文件的信息和在磁盘里的位置等信息。打 开文件表记录已打开的文件,对应文件表中的文件信息,和文件表里的文件节点类似,记 录了文件在模拟磁盘中的信息。3数据流图图3-3数据海图4数据结构设计通过分析课程设计要求,具体
10、设计出如下数据结构(1)定义常量const char* = "C:myfiles"const int BlockSize = 512;/盘块大小const int BlockCount = 128; / 盘块数磁盘大小目录文件的最多FC琳const int DiskSize = BlockSize*BlockCount; /const int BlockFcbCount= BlockSize/sizeof(FCB);/通过定义常量确定模拟文件系统磁盘的路径,以及文件块的大小,盘块数,以及分配 的磁盘大小和目录文件的最多文件控制块(FCB)数目。(2)文件控制块结构体定义st
11、ruct FCB /文件控制块char fname16; 文件名char type; 文件类型int size; / 文件大小int fatherBlockNum; / 父目录块号int currentBlockNum; / 当前的盘块void chushihua()strcpy(fname,"'0");type = NULL;size =0;fatherBlockNum = currentBlockNum = 0;通过结构体类型定义了文件控制块,文件控制块包括文件名,文件类型,文件大小,父目录块号,以及当前盘块,并且对文件控制块进行了初始化操作。文件控制块用来对文
12、 件进行管理。(3)目录文件结构struct dirFilestruct FCB fcbBlockFcbCount;void init(int _FatherBlockNum,int _CurrentBlockNum,char *name)/ 父块号, 当前块号,目录名strcpy(fcb0.fname,name);/本身的 FCB fcb0.fatherBlockNum=_FatherBlockNum; fcb0.currentBlockNum=_CurrentBlockNum;fcb0.type=DIRECTORY; /标记目录文件for(int i=1;i<BlockFcbCoun
13、t;i+) fcbi.fatherBlockNum=_CurrentBlockNum; /标记为子项fcbi.type=NULL; /标记为空白项 ; 该结构体定义了目录文件结构,目录文件采用FC叫构体数组方式进行组织管理,用来存储新创建的目录,把目录的相关信息保存在文件控制块结构体中。(4)磁盘结构体定义 struct DISK int FAT1BlockCount;/FAT1int FAT2BlockCount;/FAT2struct dir; /根目录char dataBlockCount-3BlockSize; void format() memset(FAT1,0,BlockCoun
14、t); /FAT1 memset(FAT2,0,BlockCount); /FAT2 FAT10=FAT11=FAT12=-2; /0,1,2盘块号依次代表 FAT1,FAT2,根目录区FAT20=FAT21=FAT22=-2; /FAT 作备份root.init(2,2,"C:");/根目录区memset(data,0,sizeof(data);/数据区 ; 用文件模拟磁盘。要求模拟系统存在两块硬盘: 用一个文件FAT1模拟磁盘c磁盘的每个盘块512字节,模拟磁盘共有128块。磁盘中第0块存放专用块内容,第1、2块存放根目录,其余存放子目录和文件5程序流程图5.1建立文件
15、目录(mkdir)程序流程图查询文件表在文件表中登记在打开文件表中登记显示创建成功图3-4 mkdir程序流程图5.2删除文件目录(rmdir)程序流程图图3-5 rmdir 程序流程图第四章程序运行与测试1程序运行主界面F 八霸硬义竹火作曾,DebuiEA,uJLd mc-歆迎进入文件系统模拟程疔-KMJ4M K-KKMMiKKiKMKM+tM WiKM-WMKM M-KK-HM-M M-KK-M M-目录管理 _mJcdirLdlrnmnc J:仓 建于目录*m<l t >*r(11 WIAPirr 二即J除至 月京istdirname J:位中普而自录下信息rdlvfime
16、):更我当例目亲文件管理h*kgLu f f ll«=nnmn .仓豺牛KMKM M M MH MM M MVC MtC MM M KM MK M X X XM M-K WM MWM M-M XXX M X MM MM XXX HIM MM MM 'K M加载文件系统成功,可以进行操作图4-1程序主界面2用mkdir dirname命令创建子目录加载文件系统成功,可以进行操作 inlkdii* my f xls图4-2 mkdir命令运行结果3用ls命令显示当前目录下信息图4-3 ls命令运行结果4用rmdir dirname命令删除子目录通过执行该命令可以看到,若删除的子目
17、录不存在,系统将给出提示。C: lsmiyf Ilspi'o ject情目录下共有0个文本文件,2个文件夹3 * i*ndii* nyf iles当前目录下不存在该子目录,C : Xmidir ilsC lsproject 文件夹.该目录下共有0个文本文件.1个文件夹图4-4 rmdir命令运行结果5用cd dirname命令改名当前目录通过该图可看到当前目录已从C:变为C:project ,命令执行成功C = lsproject文件夹.该目录下共有0个文本文件.1个文件夹C:cd projectC:pro ject图4-5 cd命令运行结果|C: cd projectR? IJ*c
18、t jc 1* at IK s Xpa*oJect Xis£1 文本文件.版目隶卜共有1个文本文件.0个文件夹图4-6在子目录下创建文件第五章课程设计总结通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加 深了对文件系统基本概念的理解,以及磁盘文件系统的文件操作。还有让我感受挺深的是 对软件工程方法的应用。设计一个软件,先要做好需求分析,这一点很重要,如果没有分 析好需求,到软件设计的最后,发现所做的功能不符合要求,那么一切都得重做,前面所 有的努力都付诸东流。还有比较重要的是,写好 E-R图,至少画出语境级的数据流图,以 及仔细画好程流程图。在程序设计的开始
19、,由于分析工作做得不够深入和细致,吃了点小 苦头。对于这样一个小设计来说,都会吃苦头,要是大工程更是无法想像,有可能会项目 失败。以后得加强对软件工程的学习。另外在运用 C语言的时候,感觉有点生疏,在组织 语言时时而出错,在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都 可以从相关资料中找到解决方法,有些问题是无法预料到的,这就需要通过自己理性的分 析得出问题的解决方案。在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。在对 自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知 识,同时在编程时用到了模块化的设计思想, 这种编程方法可
20、以使我们的编程变的更简单, 可以使我们的查错与纠错变的更方便。总的来说通过这次的设计的学习使我学到了很多在 平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣, 我想我会在这条路上继续前进下去。我相信,只要不断的严格要求自己,注意培养自己的 思维能力,就一定会有更大更辉煌的发展和提高。附录I参考文献1张尧学等编著.计算机操作系统教程.北京:清华大学出版社,2006.022汤子瀛等编著.计算机操作系统.西安:西安电子科技出版社,1996.123陈向群 编著.操作系统教程.北京:北京大学出版社,2007.014罗宇 等编著操作系统课程设计.北京:机械工业出版社,2005.
21、9附录n程序清单#include <stdio.h>#include <memory.h>#include <string>#include <iostream> using namespace std;#define GENERAL 1 /普通文件#define DIRECTORY 2 / 目录文件#define NULL 0 / 空文件struct FCB /文件控制块char fname16; 文件名char type; / 文件类型int size; /文件大小int fatherBlockNum; /父目录块号int currentBl
22、ockNum; /当前的盘块void chushihua()strcpy(fname,"0");type = NULL;size =0;fatherBlockNum = currentBlockNum = 0;/定义常量const char* = "C:myfiles"const int BlockSize = 512;/const int OPEN_MAX = 5;/const int BlockCount = 128; /盘块大小能打开最多的文件数 盘块数const int DiskSize = BlockSize*BlockCount; /cons
23、t int BlockFcbCount = BlockSize/sizeof(FCB);磁盘大小目录文件的最多 FCB数int Open = 0;struct OPENLIST / 用户文件打开表int files; /当前打开文件数FCB fOPEN_MAX; /FCB 复制 OPENLIST() ;for(int i=0;i<OPEN_MAX;i+)fi.fatherBlockNum=-1;/为分配打开fi.type=GENERAL; ;/目录文件结构 struct dirFile struct FCB fcbBlockFcbCount;void init(int _FatherBl
24、ockNum,int _CurrentBlockNum,char *name)父块号,当前块号,目录名strcpy(fcb0.fname,name);/本身的 FCBfcb0.fatherBlockNum=_FatherBlockNum;fcb0.currentBlockNum=_CurrentBlockNum;fcb0.type=DIRECTORY; /标记目录文件for(int i=1;i<BlockFcbCount;i+)fcbi.fatherBlockNum=_CurrentBlockNum; /标记为子项fcbi.type=NULL; /标记为空白项 ; struct DISK
25、 int FAT1BlockCount;/FAT1int FAT2BlockCount;/FAT2struct dir; /根目录char dataBlockCount-3BlockSize; void format() memset(FAT1,0,BlockCount); /FAT1 memset(FAT2,0,BlockCount); /FAT2 FAT10=FAT11=FAT12=-2; /0,1,2盘块号依次代表 FAT1,FAT2,根目录区FAT20=FAT21=FAT22=-2; /FAT作备份root.init(2,2,"C:");根目录区memset(dat
26、a,0,sizeof(data);/数据区;/全局变量FILE *fp; / 磁盘文件地址char * BaseAddr; / 虚拟磁盘空间基地址string currentPath="C:" /当前路径int current=2; / 当前目录的盘块号string cmd; /输入指令struct DISK *osPoint; /磁盘操作系统指针char command16; /文件名标识struct OPENLIST* openlist; /用户文件列表指针/函数声明int format。;int mkdir(char *sonfname);int rmdir(char
27、 *sonfname);int create(char *name);int listshow();int changePath(char *sonfname);int exit();/系统初始化int format()current = 2;currentPath="C:" /当前路径osPoint->format();/ 打开文件列表初始化delete openlist;openlist=new OPENLIST;/* 保存到磁盘上 my*/fp = fopen(,"w+");fwrite(BaseAddr,sizeof(char),DiskS
28、ize,fp);fclose(fp);printf("nn");return 1;/创建子目录int mkdir(char *sonfname)/判断是否有重名/寻找空白子目录项/寻找空白盘块号/ 当前目录下增加该子目录项/分配子目录盘块,并且初始化/ 修改fat表int i,temp,iFAT;struct dirFile *dir; /当前目录的指针if(current=2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data current-3);/为了避免该目录下同名文件夹fo
29、r(i = 1;i<BlockFcbCount;i+)if(dir->fcbi.type=DIRECTORY && strcmp(dir->fcbi.fname,sonfname)=0) printf("该文件夹下已经有同名的文件夹存在了!n");return 0;/ 查找空白fcb序号for(i=1;i<BlockFcbCount;i+)if(dir->fcbi.type=NULL)break;if(i=BlockFcbCount)printf(" 该目录已满!请选择新的目录下创建!n"); return
30、0;temp=i;for(i = 3;i < BlockCount;i+)if(osPoint->FAT1i = 0) break;if(i = BlockCount)磁盘已满!n"); printf(" return 0;iFAT=i;/接下来进行分配osPoint->FAT1iFAT=osPoint->FAT2iFAT = 2; 2表示分配给下级目录文件/填写该分派新的盘块的参数strcpy(dir->fcbtemp.fname,sonfname);dir->fcbtemp.type=DIRECTORY;dir->fcbtemp
31、.fatherBlockNum=current;dir->fcbtemp.currentBlockNum=iFAT;/初始化子目录文件盘块dir=(struct dirFile*)(osPoint->data iFAT-3); /定位到子目录盘块号dir->init (current,iFAT,sonfname);/iFAT是要分配的块号,这里的 current 用来指要分配的块的父块号printf("nn");return 1;/删除当前目录下的文件夹int rmdir(char *sonfname)int i,temp,j;/确保当前目录下有该文件,并
32、记录下该FCB下标struct dirFile *dir; /当前目录的指针if(current=2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data current-3);for(i=1;i<BlockFcbCount;i+) /查找该目录文件if(dir->fcbi.type=DIRECTORY && strcmp(dir->fcbi.fname,sonfname)=0) break;temp=i;if(i=BlockFcbCount)printf("当
33、前目录下不存在该子目录!n");return 0;j = dir->fcbtemp.currentBlockNum;struct dirFile *sonDir; /当前子目录的指针sonDir=(struct dirFile *)(osPoint->data j - 3);for(i=1;i<BlockFcbCount;i+) /查找子目录是否为空目录if(sonDir->fcbi.type!=NULL)printf("该文件夹为非空文件夹,为确保安全,请清空后再删除!n");return 0; / 删除子目录 osPoint->F
34、AT1j = osPoint->FAT2j=0; /fat清空char *p=osPoint->dataj-3; /格式化子目录memset(p,0,BlockSize);dir->fcbtemp.chushihua(); /回收子目录占据目录项printf("nn");return 1; /查询子目录int listshow()int i,DirCount=0,;/ 搜索当前目录struct dirFile *dir; /当前目录的指针if(current=2)dir=&(osPoint->root);elsedir=(struct dir
35、File *)(osPoint->data current-3);for(i=1;i<BlockFcbCount;i+)if(dir->fcbi.type=GENERAL) /查找普通文件;printf("%s文本文件.n",dir->fcbi.fname);if(dir->fcbi.type=DIRECTORY) / 查找目录文件DirCount+;printf("%s文件夹.n",dir->fcbi.fname);printf("n 该目录下共有 %d个文本文件,%d个文件夹nn",);prin
36、tf("nn");return 1;/进入当前目录下的子目录 int changePath(char *sonfname) struct dirFile *dir; /当前目录的指针if(current=2) dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data current-3);/* 回到父目录*/if(strcmp(sonfname,".")=0) if(current=2) printf("你现已经在根目录下!n");return 0;
37、 current = dir->fcb0.fatherBlockNum ;currentPath=currentPath.substr(0,currentPath.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=BlockFcbCount)printf(" 不存在该目录!n");return 0;/ 修改当前文件信息current=dir->fcb temp.currentBlockNum ;currentPath = currentPath+dir->fcb temp.fname +""printf(&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心血管疾病队列研究的样本量流失控制策略
- 心血管AI筛查中的患者数据安全策略
- 心脏移植供体分配的跨区域调配机制
- 心力衰竭数据随访质量控制策略
- 微创神经手术中麻醉与血流动力学的协同管理
- 微创神经外科中器械干扰的规避与配合技巧
- 微创引流装置在神经外科手术中的技术创新路径
- 循证医学中异质性处理的实践策略
- 影像与外科手术:术前评估的影像学策略
- 2025年广告效果监测合同协议
- 商务决策指南商业逻辑能力测试及答案解析
- 前庭大腺囊肿课件
- 工程签证与索赔专题分享
- 律师事务所薪酬管理制度
- 产后康复营销实战培训体系
- 生物样本库解决方案
- 焊工(技师)模拟100题及答案
- 统编版(2024)八年级上册道德与法治期末复习必背知识点手册
- 比亚迪股份回购动因及绩效分析
- 冬季养生健康知识培训课件
- 国家安全生产十五五规划
评论
0/150
提交评论