版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验成绩姓名任倩倩 倪晨学号20112105902011210542华中师范大学计算机科学系实验报告书实验题目: 基于两级目录结构的简单文件系统的管理与操作课程名称:操作系统主讲教师:叶俊民教授辅导教师:叶俊民教授班 级:l_j实验时间:2013年12月10日目录CDIO性质的实践步骤:2构思性实践(C)(做什么)2设计性实践(D)(准备怎么做)2实现性实践(1)(做的结果)2运行性实践(0)(做的方式)3一、实验目的3二、实验内容3三、实验坏境3四、实验详细实现过程与算法流程3五、源程序(加注释)5六、实验结果19CDIO性质的实践步骤:构思性实践(C)采用两级目录,即设置主文件目录MFD和
2、用户文件目录UED o在主文件目 录中,每个用户目录都占有一个目录项,其目录项中包含文件名和指向该文件目 录文件。在用户文件目录UFD中,这些文件目录具有相似的结构。具体测试时可 考虑:设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用 户可以打开5个文件,并需要对文件设置保护措施。(2)设计并实现 Create Open、Read Write、Close、Delete 等文件命令的 算法,用户可通过菜单方式或者API方式实现对自己文件的管理。设计性实践(D)1、确定基本数据结构,MFD, UFD. , Userinf, Fileinf, File,以及每个数 据结构可以进行的
3、对应操作。2、确定每个函数的参数、返回对象,并且完成每个函数,没完成一个函数, 需要进行一次测试。3、确定用户菜单,并将用户菜单与对应的函数操作进行关联。4、完整测试每个功能,找出存在的缺陷,并对用户界面做适当调整。具体 可参见本实验报告的“三、实验环境”和“四、实验设计原理”。实现性实践1、完成代码编写,形成.c源文件与.exe可执行文件;2、进行演示,演示应包含所有功能点,将演示结果截图保存;完成实验报告说明,具体可参见本实验报告的“五、实验详细实现过程与算 法流程”、“六、实验调试”和“七、源程序”。运行性实践(O)1、小组成员确定程序需要完成的功能,并详细列出功能点为后期检查程序是否满
4、足需求做准备。2、确定编码人员,由编码人员完成基本编码工作,另一人负责对完成的程 序进行测试,检查是否满足所有的功能点。3、对不满足的功能点或缺少的功能点进行修改或增加,重复第2步,直至 符合要求。4、完成上机验收。具体可参见本实验报告的和“九、实验结果分析”和“十一、实验总结”。一、实验目的:为了模拟文件系统实现的基本功能,了解文件系统的基本结构和文件的各种 管理方法,加深理解文件系统的内部功能及内部实现,理解文件管理的工作过程, 加深各种文件操作命令的实质内容和执行过程的了解,现要求编程模拟一个简单 的文件系统,以实现对文件系统的管理和控制功能,支持用户对自己文件的管理 与操作。二、实验内
5、容:(1) 要求本文件系统采用两级目录,即设置主文件目录MFD和用户文件目录 UED o在主文件目录中,每个用户目录都占有一个目录项,其目录项中 包含文件名和指向该文件目录文件。在用户文件目录UFD中,这些文件目 录具有相似的结构。具体测试时可考虑:设计一个10个用户的文件系统, 每次用户可保存10个文件,一次运行用户可以打开5个文件,并需要对 文件设置保护措施。(2) 设计并实现 Create Open、Read Write、Close、Delete 等文件命令的 算法,用户可通过菜单方式或者API方式实现对自己文件的管理。三、实验环境:Windows操作系统、VC+6. 0、C语言四、实验
6、详细实现过程与算法流程my_foimat:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局, 并在其上创建根目录以及用于管理文件存储空间等的数据结构。my_mkdir:用于创建子目录。my_imdk:用于删除子目录。my_ls:用于显示目录中的内容。my_cd:用于更改当前目录。my_create:用于创建文件。my_open:用于打开文件。 my_close:用于关闭文件。my_write:用于写文件。my_read:用于读文件。my_im:用于删除文件。my_exitsys:用于退出文件系统。1. 打开文件函数fopen()(1)格式:FILE *fbpen(const
7、char * filename,const char *mode)(2)功能:按照指定打开方式打开指定文件。(3)输入参数说明:filename :待打开的文件名,如果不存在就创建该文件。mode:文件打开方式,常用的有:V:为读而打开文本文件(不存在则出错)。”w”:为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写,原内容将 被覆盖)。”a”:为在文件末尾添加数据而打开文本文件。(若不存在则创建该文件;反之,在原文件末尾 追加)。为读和写而打开文本文件。(读时,从头开始:在写数据时,新数据只覆盖所占的空间, 其后不变)。” W+”:首先建立一个新文件,进行写操作,随后可以从
8、头开始读。(若文件存在,原内容将 全部消失)。”a+“:功能与”聲相同;只是在文件末尾添加新的数据后,可以从头开始读。另外,上述模式字符串中都可以加一个b”字符,如rb、wb、ab、rb+、wb+、ab+等组合, 字符“b”表示fopen()函数打开的文件为二进制文件,而非纯文字文件。(4)输出:一个指向FILE类型的指针。2. 关闭文件函数fcloseQ(1)格式:mt fclose(FILE * stream);(2)功能:用来关闭先前fopen()打开的一个文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源。(3)输入参数说明:stream:指向要关闭文件的指针,它是
9、先前执行fopen()函数的返回值。(4)输出:若关闭文件成功则返回0;有错误发生时则返回EOF并把错误代码存到em】o。3. 读文件函数fieadQ(1)格式:size_t fread( void *buffer, size_t size, size_t count, FILE * stream):(2)功能:读二进制文件到内存。(3)输入参数说明:buffer:用于存放输入数据的缓冲区的首地址;stream:使用fopen()打开的文件的指针,用于指示要读取的文件; size:每个数据块的字节数:count:要读入的数据块的个数;size*count:表示要求读取的字节数。(4)输出:实际
10、读取的数据块的个数。4. 写文件函数fwiiteQ(1)格式:size_t fvite(const void *bufier,size_t size,size_t count,FILE *stream);(2)功能:将数据写到二进制文件中。(3)输入参数说明:buffer:用于存放输出数据的缓冲区的首地址;stream:使用fopen()打开的文件的指针,用于指示要写出的文件;size:每个数据块的字节数;count:要写出的数据块的个数;size*count:表示要求写出的字符数。(4)输出:实际写出的数据块的个数。5.判断文件结束函数feofO(1) 格式:mt feof(FILE * s
11、tream)(2) 功能:用来判断是否已读取到文件末尾。(3) 输入参数说明:stream:使用fopen()打开的文件的指针,用于指示要判断的文件。(4) 输出:如果已读到文件尾则返回非零值,其他情况返回0。6主要函数功能实现:int forniatQ; /格式化磁盘mt mkdn(cliaf *sonfiiame); / 创建子目录mt rmdir(char *sonfiiame); / 删除子目录iiit create(char *name); / 创建文件int listshowQ;/显示子文件信息mt delfile(chai *name); 删除文件mt changePath(ch
12、ai- *soiifname);/ 更改当前路径iiit write(char *naine); / 写入文件int exit。;/退出系统mt open(chai- *file);打开文件mt close(char *file);/ 关闭文件mt read(char *file);/读取文件五、源程序:#include #include #include #include using namespace std;define GENERAL 1/1代表普通文件2代表目录文件0表示空文件define DIRECTORY 2frdefine Zero 0 stmct FCBchai fhame1
13、6; /文件名chai- type; 0空文件1目录文件2空文件 int size; 文件大小int fatheiBlockNum; 当前的父目录盘块号int currentB lockNum; 当前的盘块void uiitializeQstrcpv(fiiame,OH);type = Zero;size =0; fatlierBlockNum = cunentBlockNum = 0;const char* FilePath = HC:niyfilesM;/*常量设置*7const mt BlockSize = 512;盘块人小const mt OPEN_MAX = 5;能打开最多的文件数c
14、onst iiit BlockCount = 128;/盘块数const iiit DiskSize = BlockSize * BlockCount; 磁盘人小const mt BlockFcbCount = BlockSize/sizeof(FCB)/目录文件的最多 FCB 数mt OpeiiFileCount = 0; /统计当前打开文件数目stiuct OPENLIST 用户文件打开表int files; 当前打开文件数FCB fOPEN_MAX; /TCB 拷贝OPENLISTQfiles=O;for(mt i=0:iOPEN_MAX;i+)fi .fatherB lockNum =
15、 -1 ; 为分配打开fi. type=GENERAL;stmct duFile/*目录文件结构*/stmct FCB fcbBlockFcbCount;void uiit(int _FatherBlockNum,iiit _CunentBlockNum,char *name)/父块号,当前块号,目 录名strcpv(fcb0.fiiame4iame); /本身的 FCB fcb0.fatherBlockNum=_FatlieiBlockNuni; fcb0.cuiTentBlockNum=_CuiTentBlockNum; fcbO .type=DIRECTORY; 标记目录文件 fbr(i
16、nt i= 1 ;iforniat();/打开文件列表初始化delete openlist;opeiilist=new OPENLIST;/*保存到磁盘上myfiles*/fp = fopen(FilePath/w+H);fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(fp);pnntf(”格式化成功! ! n”);return 1;iiit nikdii(chai *sonfiiame)/*仓J建子 目 录*/判断是否有重名寻找空白子目录项寻找空白盘块号当前目录卞增加该子目录项分配子目 录盘块,并且初始化修改fat表int itempjFAT
17、;stmct dirFile *dn; 当前目录的指针incurrent = 2) II 根目录di尸&(osPoint-root);elsedir=(stmct dirFile *)(osPoiiit-data cunent-3);/*为了避免该目录下同名文件夹*/fbr(i = 1 ;ifcbi.tvpe=DIRECTORY & sticnip(du-fcbi.fhame,sonfhame)=0) pnntf(”该文件夹下已经有同名的文件夹存在了 !n”); return 0;for(i = l;i fcbi .type=Zero)break;if(i = BlockFcbCount)pn
18、mf(”该目录已满!请选择新的目录下创建!n”);return 0;temp = i;fbr(i = 3;i FAT 1 i = 0)break;if(i = BlockCount)磁盘己满!n);return 0;1FAT=1;/*接下来进行分配*/osPoint-FAT 1 iFAT=osPomt-FAT2iFAT = 2;/2 表示分配给下级目录文件填写该分派新的盘块的参数strcpv(dif-fcbtemp.fhame,sonfiiame);du-fcbtemp.type=DIRECTORY;du-fcbtemp.fatheiBlockNiim=cunent; du-fcbtemp.c
19、urrentBlockNum=iFAT;初始化子目录文件盘块dii-(stmct dirFile*)(osPomt-data 1FAT-3);定位到子目录盘块号du-iiut (current,iFAT.sonfhame)y/iFAT是要分配的块号,这里的current用来指要分配的 块的父块号printf(仓9建子目录成功! n);return 1;mt imdir(char *sonfiiame)/*删除当前目录下的文件夹*/int i,temp,j;/确保当前目录F有该文件,并记录下该FCB K标stmct dirFile *dn;当前目录的指针if(current=2)di尸&(osP
20、oint-root);elsedir=(stmct dirFile *)(osPoiiit-data cunent-3);for(i=l ;ifcbi.tvpe=DIRECTORY & sticmp(dir-fcbi.fname,sonfhame)=0) break;temp=i:if(i=BlockFcbCount)prmtf(当前目录卜-不存在该子目录!n”);return 0;pnntf(”己经达到目录项容纳上限,无法创建新目录!5”); return 0;for(i = 3;iFAT 1 i=0)break;if(i=BlockCount) pnntf(磁盘己满!n);return 0
21、;1FAT=1;/*进入分配阶段*/分配磁盘块osPoint-FATliFAT = osPomt-FAT2iFAT = 1;/*接卞来进行分配*/填写该分派新的盘块的参数strcpv(dir-fcbemptyNum fham 匕 ikhm);du-fcbemptyNum .type=GENERAL;du-fcbemptyNum. fatherB lockNum=cunent; du-fcbemptyNum.cunentBlockNum=iFAT;du-fcbemptyNum .size =0;chai* p = osPoint-dataiFAT -3;meniset(p,4,Blocksize
22、);pnntf(在当前目录卜创建文本文件成功! 5”);return 1;/*查询子目录*/mt listshowQint i,DirCount=0,FileCount=0;搜索当前目录stmct dirFile *dn;当前目录的指针if(current=2)di尸&(osPoint-root);elsedir=(stmct dirFile *)(osPoiiit-data cunent-3);fbr(i= 1 ;ifcbi.tvpe=GENERAL)/查找普通文件FileCount+;priiitf(n%s 文本文件.nu,dir-fcbi.fhame); if(du-fcbi.type=
23、DIRECTORY) 查找目录文件DirCouiit+;prmtf(H%s文件夹.irdu-fcbi.fhame);piintf(Mn该目录卜共有%d个文本文件,d个文件夹XnXnFileCount.DirCouiit); return 1;/*在当前目录下删除文件*/mt delfile(chai- *name)int ijempj;确保当前目录下有该文件,并且记录卞它的FCB卞标stmct dirFile *dir;当前目录的指针incurrent = 2)di尸&(osPoint-root);elsedir=(stmct dirFile *)(osPoiiit-data cunent-3
24、);for(i=l;i fcbi.tvpe=GENERAL & strcmp(du-fcbi.fiiainejiame尸=0) break;if(i = BlockFcbCount)pnntf(”当前目录卜不存在该文件!n);return 0;int k;foi(k=0;kf kJ. type = GENERAL)&(sticmp(opeiilist-f k fiiame jiame)=0) if(openlist-flk .fatherBlockNum = current) break;elsepnntf(”该文件未在当前目录下!n”);return 0;以k!=OPEN_MAX) clos
25、e(name);从打开列表中删除/*开始删除文件操作*/temp=i:j = dir-fcb temp.cuirentBlockNum ;查找盘块号 josPoint-FAT 1 (j=osPomt-FAT2j=0; /fatl,fat2 表标记为空白 char *p=osPomt-dataj -习;meniset(p,O,Blocksize); 清除原文本文件的内容 dii-fcbtemp .initializeQ; /type=O;标记该目录项为空文件pmitf(在当前目录卜删除文件成功! n);return 1;/*进入当前目录下的子目录*/mt changePath(chai- *so
26、iifiiame)stmct dirFile *dk;当前目录的指针if(current=2)di尸&(osPoint-root);elsedir=(stmct dirFile *)(osPoiiit-data cunent-3);/*回到父目录*/if(strcmp(soiifiiame,n. ”)=0) if(cunent=2)pimtfC你现已经在根目录下!n);return 0;current = du-fcb0.fatherBlockNum;curientPath = curientPatli.substr(05cunentPath.size() strlen(dir-fcb0.fi
27、iame )-1); return 1;/*进入子目录*/确保当前目录下有该目录,并且记录下它的FCB卜标int i,temp;for(i = 1; i fcbi.tvpe=DIRECTORY&strcmp(du-fcbi .fiiame,sonfiiame)=0) temp=i;break;if(i=BlockFcbCount)prmtf(不存在该目录!n“);return 0;修改当前文件信息current=dir-fcb temp .cunentBlockNum;currentPatli = cunentPath+dk-fcb temp.fiiame +”;pmitf(进入当前目录卞的子
28、目录成功! n”);return 1;mt exitQ/保存到磁盘上 C:niyfiles将所有文件都关闭/*System exit*/Q)=fbpen(FilePath;,w+H);fwrite(BaseAddr,sizeof(char),DiskSize,Q);fclose(fp);释放内存上的虚拟磁盘free(osPoint);释放用户打开文件表delete opeiilist;pnntf(”退出文件系统成功! iin”);return 1;iiit write(char *name)/*在指定的文件里记录信息*/int i;char *staitPomt,*endPomt;在打开文件列
29、表中查找file(还需要考虑同名不同目录文件的情况!) for(i=0;KOPEN.MAX;i+)if(strcmp(openlist-f i.fiiame4iame)=0 )if(openlist-fli .fatheiBlockNum =cunent) break;elsepmitfC该文件处于打开列表中,本系统只能改写当前目录下文件!n”); return 0;选=OPEN_MAX)pnntf(”该文件尚未打开,请先打开后写入信息!n”);return 0;int active=i;int fileStartNum = openlist-factive.cuiTentBlockNum -
30、 3 ; staitPomt = osPomt-datafileStanNum;endPomt = osPoint-datafileStartNum + 1;pnntf(请输入文本以CtrlD号结束:t”);char input;while(input=getcharQ) =4) if(staitPomt endPouit-1) *staitPoiiit+ = mput;elseprintf(达至lj单体文件最大容量! “);*startPoiiit-H- = 4;break;return 1;int read(char *file)/*选择一个打开的文件读取信息*/int i.fileSta
31、rtNum:char *staitPomt,*endPomt;/stiuct duFile *dir;在打开文件列表中查找file(还需要考虑同名不同目录文件的情况!) for(i=0;if i.fiiame,file)=0) if(openlist-fli .fatheiBlockNum =cunent) break;elseprmtfC该文件处于打开列表中,本系统只能阅读当前目录下文件!n”); return 0;if(i=OPEN_MAX)pnmf(”该文件尚未打开,请先打开后读取信息!n”);return 0;int active=i;/计算文件物理地址fileStartNum = o
32、peiilist-factive.cunentBlockNum - 3 ; staitPomt = osPomt-datafileStailNum;endPomt = osPoint-datafileStartNum + 1;printfC该文件的内容为:”);while(*staitPomt)! =4& (stanPomt endPomt)putchar(*stanPomt-H-);pimtffE);return 1;int open(chai- * file)/打开文件/*当前目录下添加一,个打开文件*/int LFcblndex;确保没有打开过该文件=相同名字+相同目录fbr(i=0;i
33、fi.type GENERAL & strcmp(openlist-f i.fiiame,file)=0 &o penlist-fli .fatherBlockNum = current)pimtfC该文件已经被打开!n);retuni 0;确保有空的打开文件项if(opeiilist-files = OPEN_MAX)pnmf(”打开文件数目达到上限!无法再打开新文件.5”); retuni 0;确保当前目录下有该文件,并且记录卞它的FCB卞标stmct dirFile *dn;当前目录的指针if(current=2)di尸&(osPoint-root);elsedir=(stmct dir
34、File *)(osPoiiit-data cunent-3);for(i = l;ifcbi.tvpe=GENERAL & strcmp(dii-fcbi.fiiaine,file尸=0 ) Fcbliidex=i;break;if(i=BlockFcbCount)pnntf(”当前目录卜不存在该文件!n);return 0;装载新文件进入打开文件列表,(FCE信息,文件数卄)? ?难道名字过不来? opeiilist-fOpeiiFileCount = dir-fcbFcbIiidex; /FCB 拷贝 opeiilist-files +;printfC文件打开成功! n”);OpeiiF
35、ileCount+;return 1;mt close(chai *file)释放该文件所占内存/释放用户打开文件列表表项inti;在打开文件列表中查找file(还需要考虑同名不同目录文件的情况!) for(i=0;if i.tvpe = GENERAL)&(sticmp(opeiilist-f i. fiiame, file)=0) if(openlist-fli .fatherBlockNum = current)break;elseprmtfC该文件已打开,但未在当前目录下,无法关闭!n”); return 0;if(i=OPEN_MAX)pnmf(”该文件未在打开列表中!n”);ret
36、imi 0;int active=i;opeiilist-files 一;opeiilist-factive.initialize();OpeiiFileCount-;printf(”该文件己关闭!n”);return 1;mt mam()printf(M Welcome To My Operate System Of File(FAT)n);pmitf(”n以下是使用说明书:n);使用说明书 pm】tf(0);pmitf(” format :对磁盘格式化. n”);pnntf(, exit :安全退出该文件系统,保存信息.);printf(M nikdk diiname :创建子目录. n”
37、);pnntf(M nndir dimarne :删除子目录. n”);Is diiname :显示当前目录下信息. n);printf(M cd diiname :更改当前目录. n”);pnntf(, create filename :创建一个新文件,并且打开. n);pnntf(, write filename :选择一个打开的文件写入信息 n);piintfC1 readfilename :选择一,个打开的文件读取信息.5);pnntf(M rmfilename :删除文件. nn);printf(M openfilename :打开文件.5);printf(M close filen
38、ame :关闭文件.nM);pm】tf( nn”);opeiilist=new OPENLIST; /创建用户文件打开表BaseAdd尸(char *)malloc(DiskSize);/申请虎拟空间并且初始化 osPoint=(stmct DISK *)(BaseAddi);/虚拟磁盘初始化 if(fp=fopeii(FilePath;r)!=NULL)/ 加载磁盘文件 fiead(BaseAddisizeof(chai).DiskSize.fp);prmtf(H加载磁盘文件(%s)成功,现在可以进行操作T IWFilePath);pnntfT这是你第一次使用该文件管理系统!t正在初始化W)
39、; format();pnmf(初始化已经完成,现在可以进行操作了!nn”);while(l)coutcunentPath;cincmd;if(cmd=nforniatH)forma tQ;else if(cmd=HnikduH)cmconunand; nikdu(conmiand);else if(cmd=Hrmdu H) ciiiconmiand;rmdu(conmiaiid);else if(cmd=Hlsn) listshowQ;else if(cmd=HcdH) cuiconmiand; changePath(conmiand);else if(cmd=HcreateH) cuiconmiand; create(conmiand);else if(cmd=HwnteM) cuiconmian
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园语言教学工作计划024年
- 2024年幼儿园小班班务计划
- 2024年餐饮业公司投资创业计划书
- 关于中学学校后勤工作计划
- 2024年12月校本研训工作计划范文
- 2024医院护士年度工作计划范文
- 公司销售员工作总结与计划
- 学生会权益部个人工作计划
- 2024年新学期八年级语文教学计划范文
- 2024年工艺品销售协议标准格式版
- 特殊约定与条款
- 法律与合规知识培训
- NB-T 47015-2011(JB-T 4709) 压力容器焊接规程
- 亚健康人群身心状况评测技术的研究进展
- 国开电大行管本科《当代中国政治制度》期末考试总题库(2024版)
- 《就业心理指导》课件
- 争做小劳模-吹响劳动的号角
- 农民工法律知识讲座
- 农民工法律维权知识讲座
- 广东省中山市2023-2024学年四年级上学期期末数学试卷
- 2024年中信证券东北分公司招聘笔试参考题库含答案解析
评论
0/150
提交评论