操作系统文件系统的设计与实现课程设计_第1页
操作系统文件系统的设计与实现课程设计_第2页
操作系统文件系统的设计与实现课程设计_第3页
操作系统文件系统的设计与实现课程设计_第4页
操作系统文件系统的设计与实现课程设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、 课程设计课程设计 题题 目目: 文文件件系系统统的的设设计计与与实实现现 学学 院院 :信信息息工工程程学学院院 系系 别别:计计算算机机系系 专专 业业: 计计算算机机科科学学与与技技术术 2011 年 12 月 30 日 内蒙古工业大学课程设计任务书 学院学院(系系):):信息学院信息学院计算机系计算机系 课程名称:课程名称:操作系统课程设计操作系统课程设计 指导教师(签名):指导教师(签名): 专业班级:专业班级: 计算机计算机09092 2 学生姓名:学生姓名: 学号:学号: 200920201039200920201039 一、课程设计题目一、课程设计题目 文件系统的设计与实现 二

2、、课程设计的目的二、课程设计的目的 通过设计一个小型文件系统,进一步掌握文件管理的方法和技术,使学生 初步具有研究、设计、编制和调试操作系统模块的能力。 三、课程设计的主要内容和要求三、课程设计的主要内容和要求(包括原始数据、技术参数、设计要求、工 作量要求等) 原始数据:文件目录项结构体,盘块结构体。 技术参数:windows xp系统,vc+6.0开发工具。 设计要求: 1设计基于位示图的文件连续分配算法; 2设计显示文件目录、建立文件、显示文件内容、复制和删除文件算法; 3画出以上算法流程图; 4编程实现算法功能; 5编写课程设计说明书。 工作量要求:完成以上设计要求中的所有算法功能。

3、四、工作进度安排四、工作进度安排 周一:布置、讲解题目,收集资料; 周二:系统分析,算法设计; 周三:编制、调试程序; 周四:测试系统,形成设计结论,编写课设报告; 周五:系统及材料验收,课设答辩。 五、主要参考文献五、主要参考文献 1 张尧学编计算机操作系统教程(第三版)习题解答与实验指导北京:清 华大学出版社,2006 2 汤子瀛主编计算机操作系统(第三版) 西安:西安电子科技大学出版社, 2001 3 张坤等编操作系统实验教程北京:清华大学出版社,2008 审核批准意见审核批准意见 系(教研室)主任(签字)系(教研室)主任(签字) 1 目录 第一章第一章设计内容设计内容.1 11 设计目

4、的 .1 12 设计要求 .1 13 程序设计思想 .1 第二章第二章 数据结构、算法和算法流程图数据结构、算法和算法流程图.2 21 数据结构 .2 22 程序功能图 .3 23 程序流程图 .3 第三章第三章 程序运行结果及分析程序运行结果及分析.7 31 程序运行结果 .7 32 程序分析 .8 第四章第四章 心得体会心得体会.9 参考文献参考文献.10 附录附录 程序清单程序清单.11 1 第一章第一章设计内容设计内容 1 11 1 设计目的设计目的 通过设计一个小型文件系统,进一步掌握文件管理的方法和技术,使 学生初步具有研究、设计、编制和调试操作系统模块的能力。 1 12 2 设计

5、要求设计要求 (1) 问题描述 在任一 os 下,建立一个大文件,把它假想成一张盘,在其中实现一个 简单的小型文件系统。 (2) 基本要求 该文件系统没有子目录机制,文件连续分配,不考虑换“盘”和分区。 做一个简单的操作界面,提供五条简单的命令: dir、mkfile、type、copy、delfile,分别用于显示文件目录、建立文件、显 示文件内容、复制和删除一个文件。 1 13 3 程序设计思想程序设计思想 阅读操作系统方面的书籍,了解操作系统的文件系统原理。结合分析 课程设计要求,确定实体以及它们之间的关系。实体关系有三张表(磁盘空 间分配表、文件表、打开文件表)、一个模拟磁盘的数组、命

6、令服务和用户 构成。用户负责输入命令。命令服务实现命令的解释、命令检查、命令帮 助以及调用相关模块执行相应的命令功能。 建立一个系统文件(模拟盘) ,并对此进行盘块的划分,第一个盘块存 放文件目录,第二盘块存放盘块位示图,自第三个盘块开始存放各具体文 件的内容,文件目录存放文件的名字,文件的扩展名,开始盘块号,所占 用的盘块数目,文件的大小;盘块位示图用来标记盘块是否被占用。 构造这些实体的关系图,数据流图、程序流程图来进行具体的设计。 2 第二章第二章 数据结构、算法和算法流程图数据结构、算法和算法流程图 2 21 1 数据结构数据结构 数据结构说明:本程序所运用的主要有两个数据结构,分别如

7、下: 文件目录结构: struct filename /文件目录项结构体 char name9; /文件名 char ext4; /扩展名 int i; /文件所占用磁盘块的第一个 磁盘块号 int amount; /文件所占用磁盘块的块数 long int size; /文件大小 ; 盘块结构: struct empty /盘块结构体 int map100; /盘块位示图 int filenum; /文件数量 ; 2 22 2 程序功能图程序功能图 模拟文件系统 显示 内容 显示 目录 创建 文件 复制 文件 删除 文件 图 2.1 重 命 名 3 文件系统提供的文件操作有建立文件(mkfi

8、le)、复制文件(copy)、显示文件 所有内容(type)、删除文件(delfile)。可以通过键盘输入命令来模拟文件的操作。 2 23 3 程序流程图程序流程图 (1)主程序流程图: 开始 初始化盘块 输入命令 分析命令 有无该命令? 显示错误信息 创建 文件 显示 目录 显示 内容 复制 文件 删除 文件 有 无 执行命令 结束 图 2.2 4 (2)初始化模块流程图: (3)写入磁盘流程图: (4)显示目录流程图: (5)显示文件流程图: 图 2.3 图 2.5 图 2.4 图 2.6 5 (6)删除文件流程图: (7)复制文件流程图: (8)创建文件流程图: 图 2.7 图 2.9

9、图 2.8 6 第三章第三章 程序运行结果及分析程序运行结果及分析 3 31 1 程序运行结果程序运行结果 (1)程序主界面 (2)创建一个文件,输入“3”显示“输入文件内容,按 键保存且退出!” (3)往文件里写内容:hello world!显示文件长度,并要求给文件命名,命名后保 存返回主界面 图 3.1 图 3.2 图 3.3 7 (4)读取刚才写入的文件,结果正确 (5)删除刚写入的文件,测试成功 3 32 2 程序分析程序分析 本程序使用一个 windows 下的文件来模拟一个磁盘,向磁盘中装入文件并进 行相关操作。采用了以空间换时间的算法,文件的大小在系统中是固定的,虽然 会浪费一

10、些空间,但文件的存取速率会加快。 图 3.4 图 3.5 8 第四章第四章 心得体会心得体会 操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使 学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通 过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、 应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有 更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学 生的实践动手能力,全面提高学生的综合素质。 在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问 题,同时在设计的过程中发现

11、了自己的不足之处,对以前所学过的知识理解得不够 深刻,掌握得不够牢固,不过设计终于顺利完成了,在设计中遇到了很多编程问题, 最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我学得到很多实用 的知识,再次我表示感谢!同时,对给过我们帮助的所有同学和各位指导老师再次 表示忠心的感谢! 在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。 在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系 统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们 的编程变的更简单,可以使我们的查错与纠错变的更方便。总的来说通过这次的设 计的学习使我学到

12、了很多在平时的学习中学不到的很多东西,通过这次课程设计, 使我对操作系统和编程产生兴趣,我想我会在这条路上继续前进下去。我相信,只 要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展 和提高。 9 参考文献参考文献 1. 教材 1 张尧学主编计算机操作系统教程(第三版) 北京:清华大学出版社, 2006 2. 主要参考书 1 张尧学编计算机操作系统教程(第三版)习题解答与实验指导北京: 清华大学出版社,2006 2 汤子瀛主编计算机操作系统(第三版) 西安:西安电子科技大学出版社, 2001 3 张坤等编操作系统实验教程北京:清华大学出版社,2008 4 张丽芬等编操作系

13、统实验教程北京:清华大学出版社,2006 5 andrew s.tanenbaum. modern operating systems, second edition.englewood cliffs,n.j,prentice hall, 2001 6 屠祁等编.操作系统基础(第三版) 北京:清华大学出版社,2000 7 冯耀霖等编.操作系统.西安:西安电子科技大学出版社,2001 8 左万历计算机操作系统教程(第二版) 北京:高等教育出版社,2004 10 附录附录 程序清单程序清单 #include iostream.h #include string #include stdio.h e

14、xtern c void exit(int); struct filename /文件目录项结构体 char name12; /文件名 char ext8; /扩展名/扩展名较小设为 10 int i; /文件所占用磁盘块的第一个磁盘块号 int amount; /文件所占用磁盘块的块数 long int size; /文件大小 file20; int num; struct empty /盘块结构体 int map20; /盘块位示图 int filenum; /文件数量 emptytable; /模块说明: void systeminit() /模拟磁盘文件初始化函数 for(int i=

15、2;i19;i+) /初始化存放位示图的盘块 emptytable.mapi=0; emptytable.map0=1; emptytable.map1=1; emptytable.filenum=0; file *fp; if(fp=fopen(filesys,wb+)=null) /wb+:为读写建立一个新文件;打开系 统文件将文件目录盘块和用“w”打开的文件只能向该文件写入。若打开的文件不 存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去, 重建一个新文件。+: 读和写 /位示图盘块写入系统文件 11 printf(can not open file n); exi

16、t(0); fseek(fp,512l,0); / int fseek(file *stream, long offset, int fromwhere); 函 数设置文件指针 stream 的位置。如果执行成功,stream 将指向以 fromwhere(偏移 起始位置:文件头 0,当前位置 1,文件尾 2)为基准,偏移 offset(指针偏移量) 个字节的位置。如果执行失败(offset 超过文件自身大小),则不改变 stream 指向的位 置。成功,返回 0,否则返回其他值。 fwrite( /把结构体 emptyable 中的内容写 入到 fp 中,数据项的大小为 struct emp

17、ty,数据项的个数为 1 fclose(fp); printf(!初始化系统成功!); void writefile() /将目录以及空闲盘块表写入磁盘 file *fp; if(fp=fopen(filesys,rb+)=null) printf(can not open file n); exit(0); rewind(fp); /将文件内部的位置指针重新指向一个流(数据流/文件)的开 头 for(int i=0;inum;i+) fwrite( /文件目录 fseek(fp,512l,0); fwrite( /位示图 fclose(fp); void dir() /显示文件目录 int

18、i,j; file *fp; if(fp=fopen(filesys,rb)=null) printf(can not open file n); exit(0); fseek(fp,512l,0); /空闲盘块表的定位 fread( 12 rewind(fp); /文件目录表的定位 num=emptytable.filenum; for(i=0;inum;i+) fread( if (num!=0) printf(系统所有文件:n); for(i=0,j=1;inum;i+,j+) printf(%s.%s,,filei.ext); if(j=5) printf(n);

19、j=1; printf(n 文件数量为 %d ,num); fclose(fp); void type() /显示文件内容 file *fp; int i,j; if(fp=fopen(filesys,rb)=null) printf(can not open file n); exit(0); fseek(fp,512l,0); fread( rewind(fp); num=emptytable.filenum; for(i=0,j=0;inum;i+,j+) fread( printf(%s.%s,,filei.ext); if(j=5) printf(n); prin

20、tf(n); char name12,ext18; printf(请输入所要查询的文件名:n); gets(name); /scanf(%s,name);/getchar(); printf(请输入扩展名:); gets(ext1); /scanf(%s,ext1);getchar(); 13 if(*(name+0)=0) printf(文件名不能为空 ! n); return; if(*ext1=0) strcpy(ext1,txt); int sign=0; for(i=0;inum;i+) if(strcmp(,name)=0) sign=1; break; if(

21、sign=0) printf(无此文件n); return; /显示文件 int b,m,n ; b=filei.i; n=filei.size; printf(-该文件位于第%d 块n,b+1); printf(-从文件读出的文件长度为:%d-n,n); /fseek(fp,b*512l,0); char cc; printf(-文件内容为:-n); printf(); for( m=0,j=1; mn; m+,j+) fseek(fp,b*512l+m,0); /fread( cc=fgetc(fp); printf(%c,cc); if(j%40=0)printf(n); printf(

22、n); fclose(fp); 14 void delfile() /删除一个文件 file *fp; int i; if(fp=fopen(filesys,r)=null) printf(can not open file n); exit(0); fseek(fp,512l,0); fread( rewind(fp); num=emptytable.filenum; for(i=0;inum;i+) fread( char name12,ext18; printf(请输入文件名:n); gets(name); /scanf(%s,name);getchar(); printf(请输入扩展名

23、:n); gets(ext1); /scanf(%s,ext1);getchar(); if(*name=0) printf(文件名不能为空 ! n); return; if(*ext1=0) strcpy(ext1,txt); char judge; printf(是否删除文件%s.%s y/n,name,ext1); scanf(%c, getchar(); if(judge=y)|(judge=y) printf(准备删除文件%s.%s !n,name,ext1); else if(judge=n)|(judge=n) return; else printf(系统默认放弃!n); ret

24、urn; int sign=0; for(i=0;inum;i+) if(strcmp(,name)=0) break; if(sign=0) printf(文件名错n); return; /回收空间 int b=filei.i; int amount=filei.amount; int j; for(j=0;jamount;j+) emptytable.mapb+=0; for( j=i;jnum-1;j+) strcpy(,filej+1.name); strcpy(filej.ext,filej+1.ext); filej.i=filej+1.i;

25、 filej.size=filej+1.size; filej.amount=filej+1.amount; emptytable.filenum=emptytable.filenum-1; num=emptytable.filenum; writefile(); printf(删除成功!n); fclose(fp); void copy() /复制一个文件 file *fq; int i,j,sign; if(fq=fopen(filesys,rb+)=null) printf(can not open file n); exit(0); fseek(fq,512l,0); fread( r

26、ewind(fq); num=emptytable.filenum; for(i=0;inum;i+) 16 fread( /for char sourcename12,destname12,ext18,ext28; printf(请输入源文件名:); gets(sourcename); /scanf(%s,sourcename);getchar(); printf(请输入源文件扩展名:); gets(ext1); /scanf(%s,ext1);getchar(); printf(请输入目标文件名:); gets(destname); /scanf(%s,destname);getchar(

27、); printf(请输入目标扩展文件名); gets(ext2); getchar(); /scanf(%s,ext2);getchar(); if(*ext2=0) strcpy(ext2,txt); if(*sourcename)=0 | (*destname)=0) printf(错误! 文件名不能为空!n); return; if(strcmp(sourcename,destname)=0) printf(错误! 两个文件名不能相同!n); return; sign=0; for(i=0;inum;i+) if(strcmp(sourcename,)=0) sig

28、n=1; strcpy(,destname); strcpy(filenum.ext,ext2); /filenum.i=filei.i; filenum.size=filei.size; filenum.amount=filei.amount; break; /for if(sign=0) printf(不存在源文件n); return; if (inum) printf(输入的文件名与第%d 个源文件相等(i 从 0 开始)n,i); /空间分配 sign=0; for(int m=2 ; m0; j-) /寻找一连续的空闲盘块 if(emptytable.mapm

29、+j-1=1) sign=1; break; /if /for if(sign=0) break; m+=j-1; sign=0; / for if (m = 19-filenum.amount) for(j=0;j filenum.amount;j+) emptytable.mapm+j=1; filenum.i=m; else printf(没有足够的连续的盘块数); /写数据 file *fq1; rewind(fq); fq1=fq; fseek(fq,(filei.i) * 512l,0); printf(n-源文件的起始盘块号:%d,filei.i); /rewind(fp1);

30、fseek(fq1,(filenum.i) * 512l,0); printf(n-复制文件的起始盘块号:%d,filenum.i); char cc; printf(n-源文件内容为:-n); for(int k=0 ; kfilei.size;k+) fseek(fq,(filei.i) * 512l+k,0); fread( printf(%c,cc); 18 fseek(fq1,(filenum.i) * 512l+k,0); fwrite( printf(n); num=num+1; emptytable.filenum=num; writefile(); /写目录及位示图 fclo

31、se(fq); fclose(fq1); void mkfile() /建立一个文件 file *fp; if(fp=fopen(filesys,r+)=null) printf(can not open filenpleace initialization at firstn); exit(0); struct strnode /数据块 char word64; struct strnode *next; *head,*p,*q; char name9,ext14; int i=0,j=0; head=p=q=new struct strnode; /申请结构体内存空间 char ch; p

32、rintf(请输入文件内容,按 键保存且退出!n); do for(i=0;iwordi=ch; if(ch=)break; if(ch!=) p=new struct strnode; q-next=p; q=p; j+; 19 while(ch!=); getchar(); int num1, size=(j*64+i)*sizeof(char); /j 为结构体的个数,i 为不足一个结构体 的字符数 / printf(文件长度为:%dn,size); char judge=n; do printf(请输入文件的英文名字:); gets(name); /scanf(%s,name);get

33、char(); printf(请输入文件的扩展名:); gets(ext1); /scanf(%s,ext1);getchar(); if(*ext1=0) strcpy(ext1,txt); judge=y; if(*name=0) printf(错误!文件名不能为空!n); printf(是否放弃此文件y/n ); scanf(%c,getchar(); if( (judge=y) | (judge=y) ) return; while( (judge=n) | (judge=n) ); fseek(fp,512l,0); fread( rewind(fp); num=emptytable

34、.filenum; /*for(i=0;inum;i+) fread( printf(%s.%sn,,filei.ext); */ for (i=0;i0) num1=num1+1; 20 strcpy(,name); /printf(%d %s %s,num,,name); strcpy(filenum.ext,ext1); filenum.size = size; filenum.amount=num1; int sign=0 ,n=0; /空间分配 for(int m=2 ; m 0; n-) if(emptytable.mapm+n-1=1) sign=1; break; /if /for if(sign=0)break; m+=n-1; sign=0; /if /for if(m=10-num1) filenum.i = m; /* else printf(空间不足!n); return; for(j=0;j 0;j-) 21 ch=p-wordi+; fwrite( if(i=64) i=0; p=p-next; / cycle-; rewind(fp); for(j=0,i=0;inum;i+,j+) /printf(断点%dn,i); fread( /printf(%sn,

温馨提示

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

评论

0/150

提交评论