文件系统课程设计报告.doc

上传人:小飞机 文档编号:4264536 上传时间:2023-04-12 格式:DOC 页数:46 大小:1.28MB
返回 下载 相关 举报
文件系统课程设计报告.doc_第1页
第1页 / 共46页
文件系统课程设计报告.doc_第2页
第2页 / 共46页
文件系统课程设计报告.doc_第3页
第3页 / 共46页
文件系统课程设计报告.doc_第4页
第4页 / 共46页
文件系统课程设计报告.doc_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《文件系统课程设计报告.doc》由会员分享,可在线阅读,更多相关《文件系统课程设计报告.doc(46页珍藏版)》请在三一办公上搜索。

1、 操作系统课程设计报告题 目:文件系统 专 业:软件工程 院 系:信息管理学院 年 级:大三软件Q1141 学 号: 11150132 姓 名: 王毅 指导教师:李红艳 职 称:副教授 湖北经济学院教务处 制目录操作系统课程设计报告一 实验内容.2二 设计的基本概念和原理.2三 总体设计.22-1 文件的组织结构.22-2 磁盘空间的管理.22-3 目录结构.32-4文件操作.4四 详细设计.44-1 建立文件(create_file)流程图44-2 打开文件(open_file)流程图.64-3读文件(read_file)流程图.74-4 写文件(write_file)流程图.84-5 关闭

2、文件(close_file)流程图.94-6 删除文件(delete_file)流程图.104-7 显示文件内容(typefile)流程图.114-8 建立目录(md)流程图.124-9显示目录内容流程图.13五 详细代码.14六 运行结果截图.40七 总结.44八 参考文献.45一、实验内容要求设计一个简单的文件系统,用文件模拟磁盘,实现以下功能:(1)支持多级目录结构;(2)实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性。(3)编写主函数对所有操作进行测试二、设计的基本概念和原理 为了正确地实现文件的存取,文件

3、系统设计了一组与存取文件有关的功能模块,用户可以用“访问指令”调用这些功能模块,以实现文件的存取要求。我们把文件系统设计的这一组功能模块称为“文件操作“,实验就是要模拟实现一些文件操作。文件操作不是独立的,它和文件系统的其他部分密切相关,若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。因此,这个实习虽然是文件操作的模拟实现,但还是必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。三、总体设计(1)文件的组织结构:文件的逻辑结构有两种形式:流式文件和记录文件。实验中只支持流式文件,采用称为显示链接的物理文件结构,把磁盘中每一块的指针部分提出来,组织在一起,形成文

4、件分配表(FAT)磁盘有多少块,文件分配表就有多少项,若某文件的一个磁盘块号为i, 则这个文件的下一个磁盘的块号应该记录在文件分配表第i项, 例如某系统文件分配表的前几项如下图所示,某个文件的起始盘块号为3,则该文件的磁盘块号依次为:3、4、9、12、13第几项0123456789101112131415内容-1-1-149078-11211-113-100(2)磁盘空间的管理:首先要模拟一个磁盘,因为是实验,不用使用真正的磁盘,所以实验中用一个文件模拟一个小磁盘。假设模拟磁盘有128个物理块,每个物理块大小为64个字节,盘块的块号从0编起,0,1,2,3,127。将文件分配表放在磁盘的开始处

5、,因为盘块邮128块,所以文件分配表有128项,每项占用一个字节,这样文件分配表占用了磁盘的0块和1块,这两块不能作其他用处,若一个盘块是某个文件的最后一块,填写“-1”表示文件结束,本实验中用0表示磁盘盘块空闲,非0表示盘块占用,用255代替-1表示文件结束,254表示盘块损坏。开始始找到文件分配表第x项,i = xY第i项是否为0NNi = i + 1分配第i块第i项是否为最后一项Y磁盘满,分配失败结束 分配一个磁盘块的流程图(3)目录结构:文件目录是用于检索文件的,它是文件系统实现按名存取的主要手段。文件目录由若干目录组成,每一个目录记录一个文件的有关信息:有关文件的控制信息。模拟文件操

6、作这部分仅包括文件名、文件类型和属性。有关文件结构的信息。模拟文件操作这部分仅包括文件在存储介质的位置(分给文件第一个盘块的块号,即起始盘块号)、文件的长度;有关文件管理的信息文件名:3个字节(实验中合法文件名仅仅、可以使用字母、数字和除“$”,“.”,“/”以外的字符,第一个字节的值为“$”时表示该目录为空目录项,文件名和类型名之间用“.”分隔,用“/”作为路径名中目录间分隔符)(4)文件操作:确定文件组织结构、目录结构和磁盘空间管理的方法后,就可以模拟文件操作的实现。实验中文件操作包括建立文件(create_file),打开文件(open_file),关闭文件(close_file),读文

7、件(read_file),写文件(write_file),删除文件(delete_file),显示文件内容(typefile)和改变文件属性(change),目录命名包括建立目录(md),显示目录类容(dir)和删除空目录(rd), 在实验室中没有程序调用这些指令,为了看到它们的模拟情况,从键盘输入选择指令来模拟用户程序的调用,首先要建立一个“已打开文件表”,用来记录打开或建立文件的相关内容,结构图如下文件路径名文件属性起始盘块号文件长度操作类型读指针写指针块号块内地址块号块内地址四、详细设计(1) 建立文件:create_file(文件名,文件属性)(2)打开文件open_file(文件名,

8、操作类型),以下为打开文件的流程图(3)读文件read_file(文件名,读取长度)(4)写文件write_file(文件名,缓冲,写长度)(5)关闭文件close_file(文件名)(6)删除文件delete_file(文件名)(7)显示文件内容(typefile)(8)目录操作命令:建立目录(md)(9)显示目录内容(rd)五、详细代码int sopen(char *name) /在已打开的文件表中查找文件nameint i;i = 0;while(i=openfile.length) return -1;return i;void dopen(char *name) /在已打开文件表中删

9、除文件name int i; i = sopen(name); if(i=-1) printf(文件未打开n); else copy(&openfile.filei, &openfile.fileopenfile.length - 1); openfile.length-; int iopen(ofile *x)/向已打开文件列表中插入文件x-nameint i;i = sopen(x-name);if(i!=-1)printf(文件已经打开n);return false;else if(openfile.length = n)printf(已打开文件表已满);return false;els

10、ecopy(&openfile.fileopenfile.length, x);openfile.length +;return true;int allocate()/分配一个磁盘块,返回块号int i;fseek(fc, 0, SEEK_SET);/将模拟磁盘的文件指针移至模拟磁盘FAT表fread(buffer1,64L, 1, fc);for(i = 3; i 63; i+)if(buffer1i = 0)/FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘buffer1i = 255;fseek(fc, 0, SEEK_SET);fwrite(buffer1, 64L

11、, 1, fc);return i; /返回磁盘号fread(buffer1, 64L, 1, fc);/将FAT表中第二个磁盘块读入模拟缓冲buffer1 for(i = 0; i 63; i+)if(buffer1i = 0)/AT中的第i项为0,分配第i64块磁盘块,修改FAT表,并且写回磁盘buffer1i = 255;fseek(fc, -64L, SEEK_CUR);fwrite(buffer1, 64L, 1, fc);return i + 64; /返回磁盘号printf(已经没有磁盘空间n);return false;int read_file(char *name, int

12、 length)/读取文件,文件名为name, 读取长度为length int i, t; char ch; if(i=sopen(name) = -1) printf(文件未打开或不存在n); return false; if(openfile.filei.flag = 1) printf(文件以写方式打开,不能读n); return false; t = 0; fseek(fc, openfile.filei.read.dnum * 64L, SEEK_SET); fread(buffer1, 64, 1, fc); while(t = 64) /一块读完,读取下一块 fseek(fc,o

13、penfile.filei.read.dnum/64*64, SEEK_SET);fread(buffer1, 64, 1, fc);openfile.filei.read.dnum=buffer1openfile.filei.read.dnum%64; openfile.filei.read.bnum = 0; /修改读指针fseek(fc, openfile.filei.read.dnum *64L, SEEK_SET);fread(buffer1, 64, 1, fc); t+; int write_file(char *name, char *buff, int length)/nam

14、e 文件路径名/buff 存放准备写入磁盘的内容/length 写入内容的长度int i, t, dd;if(i=sopen(name)= -1)printf(文件未打开或不存在n);return false;if(openfile.filei.flag = 0)printf(文件以只读方式打开,不能写n);return false;t = 0;fseek(fc,openfile.filei.write.dnum*64L, SEEK_SET);fread(buffer1,64,1,fc); while(t=64) fseek(fc, openfile.filei.write.dnum*64L,

15、 SEEK_SET);fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/if(dd=allocate()=false) openfile.filei.write.bnum-;openfile.filei.length-;printf(无磁盘空间,部分信息丢失,写失败n);return (false); fseek(fc,openfile.filei.write.dnum/64*64L, SEEK_SET);fread(buffer1,64,1,fc);buffer1openfile.filei.write.dnum%64=dd;fseek(fc,openfile.fil

16、ei.write.dnum/64*64L, SEEK_SET); fwrite(buffer1,64,1,fc); openfile.filei.write.dnum=dd;openfile.filei.write.bnum=0; t+; fseek(fc, openfile.filei.write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);/一块写完,写回磁盘/*写函数结束*/int search(char *name, int flag, int *dnum, int *bnum)/查找路径名为name的文件或目录,返回该目录的起始盘块号/fl

17、ag=8 表示查找目录,否则为文件/dnum, bnum 返回文件或目录的目录项登记位置,盘块dnum中第bnum项 int k, i, s, t, j, last = 0;char pna3, type2;if(strcmp(name, ) = 0 | strcmp(name, /) = 0)/根目录return 2;k = 0;if(name0 = /) k =1;i = 2; / i为根目录的起始盘号while(last != 1) /pna为从name中分离出/后一个目录名或文件名for(s = 0; namek!=. & namek != / & s 3 & namek!= 0; s

18、+, k+) pnas = namek;for( ; s 3; s+)/用空格补齐全名字长度pnas = ;while(namek!=. & namek!=0 & namek != /)/除去多余字符k+;type0= type1 = ;if(namek = .)/ 取文件类型名 if(flag = 8)printf(目录不应该有类型名,查找失败n);return false;else/文件遇到类型名认为结束,后面的字符作废k+;if(namek != 0) type0 = namek;k+;if(namek != 0) type1 = namek;if(namek != 0 & namek+

19、1 != 0)printf(文件名错误n);return false;last = 1;elseif(namek != 0) k +;if(namek = 0)last = 1;/查找名字等于pna的目录项fseek(fc, i*64L, SEEK_SET);fread(buffer2, 64L, 1, fc);j = 0;if(last =1 & flag != 8) /查找名字pna,类型名type的文件目录项while(j 8 & !buffer2j.attribute != 8 & buffer2j.name0 = pna0 & buffer2j.name1= pna1 & buffe

20、r2j.name2 = pna2)j +;else while(j 8 & !buffer2j.attribute = 8 & buffer2j.name0 = pna0 & buffer2j.name1= pna1 & buffer2j.name2 = pna2) j +; if(j 8) /找到该目录或文件if(last = 1) /查找结束*dnum = i;*bnum = j;return buffer2j.address;else i = buffer2j.address;elseprintf(路径错误n);return false;/while 查找结束/search查找结束int

21、 create_file(char *name, int attribute)/建立文件,路径为name,文件属性attribute int dnum, bnum, i, j, last, k, s, d, t, tt, b, dd, flag, dn, bn; char dname3, tname2, pathname20; ofile x; if(attribute % 2 = 1) printf(只读文件,无法写,不能建立n); return false; if(openfile.length = n) printf(已打开表已满,不能建立n); return false; /将name

22、分为两部分,目录路径pathname和目录名dname for(j = 0; namej != 0; j+)/查找最后一个/ if(namej = /) s = j; for(j = 0; j s; j+)/分离目录路径 pathnamej = namej; pathnamej = 0; /字符数组最后一个置0 for(k = 0, j = s+1; namej!=0 & k 3 & namej!=.; j+,k+)/分离文件名 dnamek = namej; if(k = 0) printf(文件名错误或目录名错误n); return false; for(; k 3; k+) dnamek

23、 = ; k = 0; if(namej + = .)/分离类型名 for( ; namej != 0 & k 2 & namej != .; j+, k+) tnamek = namej; for( ; k 2; k +) tnamek = ; if(d = search(pathname, 8, &dn, &bn) = false)/找目录路径 printf(目录不存在,不能建立n); return false; /确认该目录不存在的同时查找空目录项 b = -1; fseek(fc, d*64L, SEEK_SET); fread(buffer2, 64L, 1, fc); /读出D盘块

24、的内容 for(t = 0; t 8; t +) if(buffer2t.name0 = dname0 & buffer2t.name1 = dname1 & buffer2t.name2 = dname2 & buffer2t.type1 = tname1) /找到名字dname的文件,建立失败 printf(文件已经存在,不能建立n); return false; if(buffer2t.name0 = $ & b = -1) b = t; if(b = -1)/没有空目录,建立失败 printf(目录无空间n); return false; if(dd = allocate() = fa

25、lse) /分配给建立目录的磁盘盘块dd printf(建立文件失败n); return false; /填写项目 for(i = 0; i 3; i+) buffer2b.namei = dnamei; for(i = 0; i 2; i +) buffer2b.typei = tnamei; buffer2b.attribute = attribute; buffer2b.address = dd; buffer2b.length = 0; fseek(fc, d * 64L, SEEK_SET); fwrite(buffer2, 64L, 1, fc); / 填写已打开文件表 strcp

26、y(x.name, name); x.attribute = attribute; x.number = dd; x.length = 0; x.flag = 1; x.read.dnum = x.write.dnum = dd; x.read.bnum = x.write.bnum = 0; iopen(&x);/文件建立结束int open_file(char *name, int attribute)/打开文件 ofile x;int dnum, bnum, last, i, d;if( (d=search(name, 4, &dnum, &bnum) = false)printf(文件

27、不存在,打开文件失败n);return false;fseek(fc, dnum * 64L, SEEK_SET);fread(buffer2, 64, 1, fc);if(buffer2bnum.attribute%2 = 1) & attribute = 1) /对只读文件要求写printf(文件不能写, 打开失败);return false;strcpy(x.name, name);x.attribute = buffer2bnum.attribute;x.number = buffer2bnum.address;x.read.dnum = x.write.dnum = buffer2b

28、num.address;x.read.bnum = x.write.bnum = 0;x.flag = attribute;if(attribute = 1)while(d != xff) /寻找文件末尾fseek(fc, d/64*64L, SEEK_SET);fread(buffer1, 64L, 1, fc); /读出dnum项所在FATlast = d;d = buffer1d % 64;x.write.dnum = last;fseek(fc, last*64L, SEEK_SET);for(i = 0; i 1)copy(&openfile.filei, &openfile.fil

29、eopenfile.length - 1);openfile.length -;int delete_doc(char *name)/删除文件int dnum, bnum, t;if(t = search(name, 4, &dnum, &bnum) = false) /查找文件printf(文件不存在n);return false;if(sopen(name) != -1) /文件已打开,不能删除 printf(文件已打开,不能删除n);return false;fseek(fc, dnum * 64L, SEEK_SET);fread(buffer2, 64, 1, fc);buffer2

30、bnum.name0 = $; /将该文件的目录置成空目录fseek(fc, dnum * 64L, SEEK_SET);fwrite(buffer2, 64, 1, fc);while(t != xff)dnum = t;fseek(fc, dnum/64*64, SEEK_SET);fread(buffer1, 64, 1, fc);t = buffer1dnum % 64;buffer1dnum % 64 = 0;fseek(fc, dnum/64*64L, SEEK_SET);fwrite(buffer1, 64, 1, fc);/文件删除结束int md(char *name)/建立

31、目录,目录路径为nameint dnum, bnum, i, j, last, k, s, d, t, tt, b, dd, flag, dn, bn;char dname3, pathname20;i = 2; /i等于根目录的起始盘块号/将name分成两部分,目录路径path和目录名dnamefor(j = 0; namej != 0; j+) /查找最后一个/if(namej = /) s = j;/分离目录路径for(j = 0; j s; j+)pathnamej = namej;pathnamej = 0;/分离目录名for(k = 0, j = s+1; namej != 0 &

32、 k 3 & namej !=.; j+, k+)dnamek = namej;if(k = 0 )printf(错误文件名或目录名n);return false;for(; k 3; k+)dnamek = ;if(d = search(pathname, 8, &dn, &bn) = false)/找不到目录路径printf(目录不存在,不能建立n);return false; b = -1;/确认该目录存在的同时查找空目录项fseek(fc, d*64L, SEEK_SET);fread(buffer2, 64L, 1, fc); /读出D盘块内容for(t =0; t 8; t +)if(buffer2t.name0 = dname0 & buffer2t.name1 = dname1 & buffer2t.name2 =

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号