操作系统课程设计报告_第1页
操作系统课程设计报告_第2页
操作系统课程设计报告_第3页
操作系统课程设计报告_第4页
操作系统课程设计报告_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

武汉工程大学

计算机科学与工程学院综合设计报告操作系统综合设计:拟文件系统的实现设计名称:操作系统综合设计:拟文件系统的实现设计题目:学生学号:专业班级:计工02学生姓名:学生成绩:指导教师(职称):蔡琼(副教授)课题工作时间:12年2月13日至12年2月24日说明:1、报告中的第一、二、三项由指导教师在综合设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。4、所有学生必须参加综合设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。答辩小组成员应由2人及以上教师组成。5、报告正文字数一般应不少于5000字,也可由指导教师根据本门综合设计的情况另行规定。6、平时表现成绩低于6分的学生,其综合设计成绩按不及格处理。7、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各类综合设计),各教研室可根据本门综合设计的特点及内容做适当的调整,并上报学院批准。

成绩评定表学生姓名:学号:班级:09计算机2班类别合计分值各项分值评分标准实际得分合计得分备注平时表现1010按时参加综合设计,无旷课、迟到、早退、违反实验室纪律等情况。完成情况3020按设计任务书的要求完成了全部任务,能完整演示其设计内容,符合要求。10能对其设计内容进行详细、完整的介绍,并能就指导教师提出的问题进行正确的回答。报告质量3510报告文字通顺,内容翔实,论述充分、完整,立论正确,结构严谨合理;报告字数符合相关要求,工整规范,整齐划一。5课题背景介绍清楚,综述分析充分。5设计方案合理、可行,论证严谨,逻辑性强,具有说服力。5符号统一;图表完备、符合规范要求。5能对整个设计过程进行全面的总结,得出有价值的结论或结果。5参考文献数量在3篇以上,格式符合要求,在正文中正确引用。答辩情况2510在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。15在规定时间内能准确、完整、流利地回答教师所提出的问题。总评成绩:分补充说明:指导教师:蔡琼(签字)日期:2012年2月24日

答辩记录表学生姓名:学号:—班级:09计算机2班答辩地点:L403号机房答辩内容记录:答辩成绩合计分值各项分值评分标准实际得分合计得分备注2510在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。15在规定时间内能准确、完整、流利地回答教师所提出的问题。答辩小组成员(签字):2012年2月24日

指导教师评语一、综合设计目的、条件、任务和内容要求:《操作系统》在计算机科学中是一门核心专业基础课,涉及较多硬件和软件知识。在计算机软、硬件课程的设置上,它起着承上启下的作用。其特点是概念多、较抽象、涉及的知识面广。《操作系统综合设计》是计算机科学与技术专业学生的一门实践课程,是学习完操作系统课程后的课程设计,本课程的教学目的是,通过学习,使学生了解计算机操作系统的发展特点;理解操作系统的基本概念、组成和各部分的功能;掌握计算机操作系统设计的基本原理和方法;理解常见操作系统的结构原理并能熟练使用。《虚拟文件系统的实现》课题,要求学生了解文件类型及文件系统模型,理解文件的逻辑结构类型及特点,理解文件外存的分配方式,掌握文件的目录管理及存储空间管理,理解文件的安全性和数据一致性。培养学生的抽象思维能力、逻辑推理能力和形式化思维方法,增强分析问题和解决问题的能力。设计任务和内容要求:在Windows或者Linux下设计一个二级(或者树型)结构文件系统,要求至少实现以下功能:login用户登录、dir列出文件目录、create创建文件、del删除文件、open打开文件、close关闭文件、read读文件、write写文件、cd进入子目录、rd删除子目录、md创建子目录等。设计提示:实现虚拟文件系统的一般思路是调用系统的文件创建(如c中的fopen函数的w方式即可)一个新文件,将此文件作为虚拟磁盘,在完成本设计要求的内容时,要求所生成的文件目录以及文件等内容都是存储在此磁盘中。指导教师签字:蔡琼2012年1月8日二、进度安排:第1周(2.13-2.14):学生熟悉课题的任务和要求,查阅相关文献和资料,并做好编码准备第1周(2.15-2.17):程序编码、调试第2周(2.20-2.22):程序编码、调试和测试,书写报告第2周(2.23-2.24):答辩、检查、验收、递交设计报告三、应收集资料及主要参考文献:应收集的资料:面向对象程序设计思想和方法高级程序设计语言参考手册操作系统、软件工程方面参考书籍主要参考文献:李小林,张俊.程序设计基础[Z].北京:中国铁道出版社,2008.汤小丹等.计算机操作系统[Z].西安:西安电子科技大学出版社,2007.严蔚敏,吴伟民.数据结构[Z].北京:清华大学出版社,2007.四、综合设计摘要:操作系统在计算机科学中是一门核心专业基础课,涉及较多硬件和软件知识。在计算机软、硬件课程的设置上,它起着承上启下的作用。其特点是概念多、较抽象、涉及的知识面广。操作系统综合设计是计算机科学与技术专业学生的一门实践课程,是学习完操作系统课程后的课程设计,本课程的教学目的是,通过学习,使学生了解计算机操作系统的发展特点;理解操作系统的基本概念、组成和各部分的功能;掌握计算机操作系统设计的基本原理和方法;理解常见操作系统的结构原理并能熟练使用。本此课程设计的课题是设计一二级结构文件系统,要求学生了解文件类型及文件系统模型,理解文件的逻辑结构类型及特点,理解文件外存的分配方式,掌握文件的目录管理及存储空间管理,理解文件的安全性和数据一致性。培养学生的抽象思维能力、逻辑推理能力和形式化思维方法,增强分析问题和解决问题的能力。关键词:操作系统;虚拟文件;二级结构五、综合设计Abstract:Theoperatingsystemincomputerscienceisacorefundamentalcourse,involvesmorehardwareandsoftwareknowledge.Incomputersoftwareandhardwareofthecoursesetting,itplaystheroleofthelink.Itscharacteristicismore,moreabstractconcept,involvingawiderrangeofknowledge.Theoperatingsystemisintegrateddesignofcomputerscienceandtechnologymajorstudentsapracticalcourses,isafterstudyingtheoperatingsystemofthecoursedesigncurriculum,theteachingpurposeofthiscourseis,throughthestudy,makestudentsunderstandthedevelopmentofthecomputeroperatingsystemcharacteristics;Understandingthebasicconceptoftheoperatingsystem,compositionandthefunctionsofthepartsofthe;Goodcomputeroperatingsystemthebasicprincipleofdesignandthemethod;Understandcommonoperatingsystemstructuretheoryandbefamiliarwith.Thecoursedesignofthesubjectistodesignthestructureof12filesystem,studentsarerequiredtounderstandfiletypeandfilesystemmodel,understandthelogicstructuretypeandfilecharacteristics,understanddocumentsallocationofCRT,masterfiledirectorymanagementandstoragespacemanagement,understandthesecurityofdocumentsanddataconsistency.Thecultivationofthestudents'abilitytothinkabstractly,logicalreasoningabilityandformalthinkingmethod,strengthentheabilitytoanalyzeandsolveproblems.Keywords:operatingsystem;Virtualfile;Thesecondarystructure目录TOC\o"1-5"\h\z\o"CurrentDocument"摘要2\o"CurrentDocument"Abstract2\o"CurrentDocument"第一章课题背景3\o"CurrentDocument"1.1课题简介31.1.1课题背景31.1.2课题目的31.1.3要求及内容3\o"CurrentDocument"1.2原理与内容31.2.1理论依据31.2.2课题内容3\o"CurrentDocument"第二章设计简介及设计方案论述4\o"CurrentDocument"设计简介4\o"CurrentDocument"设计方案论述4\o"CurrentDocument"2.3概要设计42.3.1数据结构42.3.2主要操作函数5\o"CurrentDocument"第三章详细设计6\o"CurrentDocument"3.1系统分析6\o"CurrentDocument"3.2文件基本操作6\o"CurrentDocument"3.3算法流程图7\o"CurrentDocument"第四章设计结果及分析8\o"CurrentDocument"4.1文件系统功能8\o"CurrentDocument"4.2系统测试8\o"CurrentDocument"4.3运行结果分析10总结11\o"CurrentDocument"致谢12\o"CurrentDocument"参考文献13附录主要程序代码14摘要操作系统在计算机科学中是一门核心专业基础课,涉及较多硬件和软件知识。在计算机软、硬件课程的设置上,它起着承上启下的作用。其特点是概念多、较抽象、涉及的知识面广。操作系统综合设计是计算机科学与技术专业学生的一门实践课程,是学习完操作系统课程后的课程设计,本课程的教学目的是,通过学习,使学生了解计算机操作系统的发展特点;理解操作系统的基本概念、组成和各部分的功能;掌握计算机操作系统设计的基本原理和方法;理解常见操作系统的结构原理并能熟练使用。本此课程设计的课题是设计一二级结构文件系统,要求学生了解文件类型及文件系统模型,理解文件的逻辑结构类型及特点,理解文件外存的分配方式,掌握文件的目录管理及存储空间管理,理解文件的安全性和数据一致性。培养学生的抽象思维能力、逻辑推理能力和形式化思维方法,增强分析问题和解决问题的能力。关键词:操作系统;虚拟文件;二级结构AbstractTheoperatingsystemincomputerscienceisacorefundamentalcourse,involvesmorehardwareandsoftwareknowledge.Incomputersoftwareandhardwareofthecoursesetting,itplaystheroleofthelink.Itscharacteristicismore,moreabstractconcept,involvingawiderrangeofknowledge.Theoperatingsystemisintegrateddesignofcomputerscienceandtechnologymajorstudentsapracticalcourses,isafterstudyingtheoperatingsystemofthecoursedesigncurriculum,theteachingpurposeofthiscourseis,throughthestudy,makestudentsunderstandthedevelopmentofthecomputeroperatingsystemcharacteristics;Understandingthebasicconceptoftheoperatingsystem,compositionandthefunctionsofthepartsofthe;Goodcomputeroperatingsystemthebasicprincipleofdesignandthemethod;Understandcommonoperatingsystemstructuretheoryandbefamiliarwith.Thecoursedesignofthesubjectistodesignthestructureof12filesystem,studentsarerequiredtounderstandfiletypeandfilesystemmodel,understandthelogicstructuretypeandfilecharacteristics,understanddocumentsallocationofCRT,masterfiledirectorymanagementandstoragespacemanagement,understandthesecurityofdocumentsanddataconsistency.Thecultivationofthestudents'abilitytothinkabstractly,logicalreasoningabilityandformalthinkingmethod,strengthentheabilitytoanalyzeandsolveproblems.Keywords:operatingsystem;Virtualfile;Thesecondarystructure第一章课题背景1.1课题简介1.1.1课题背景操作系统在计算机科学中是一门核心专业基础课,涉及较多硬件和软件知识。在计算机软、硬件课程的设置上,它起着承上启下的作用。其特点是概念多、较抽象、涉及的知识面广。1.1.2课题目的通过学习,使学生了解计算机操作系统的发展特点;理解操作系统的基本概念、组成和各部分的功能;掌握计算机操作系统设计的基本原理和方法;理解常见操作系统的结构原理并能熟练使用。1.1.3要求及意义了解文件类型及文件系统模型,理解文件的逻辑结构类型及特点,理解文件外存的分配方式,掌握文件的目录管理及存储空间管理,理解文件的安全性和数据一致性。培养学生的抽象思维能力、逻辑推理能力和形式化思维方法,增强分析问题和解决问题的能力。1.2原理与内容1.2.1理论依据文件系统是Linux操作系统的重要组成部分,Linux文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。1.2.2课题内容在Windows或者Linux下设计一个二级(或者树型)结构文件系统,要求至少实现以下功能:login用户登录、dir列出文件目录、create创建文件、del删除文件、open打开文件、close关闭文件、read读文件、write写文件、cd进入子目录、rd删除子目录、md创建子目录等。第二章设计简介及设计方案论述2.1设计简介本系统是模拟实现多用户多目录的文件系统,在系统出现登录后,输入用户与口令,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指定的文件中。系统的命令与其命令的具体实现,此模拟系统共提供了上述命令,并根据命令的含义与要求,用C++编程来完成所有具体操作。该系统可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能2.2设计方案论述本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。2.3概要设计2.3.1数据结构structfatitem/*size8*/{intitem;/*存放文件下一个磁盘的指针*/charem_disk;/*磁盘块是否空闲标志位0空闲*/};structdirect{/*-----文件控制快信息-----*/structFCB{charname[9];/*文件/目录名8位*/charproperty;/*属性1位目录0位普通文件*/intsize;/*文件/目录字节数、盘块数)*/intfirstdisk;/*文件/目录起始盘块号*/intnext;/*子目录起始盘块号*/intsign;/*1是根目录0不是根目录*/}directitem[MSD+2];};structopentable{structopenttableitem{charname[9];/*文件名*/intfirstdisk;/*起始盘块号*/intsize;/*文件的大小*/}openitem[MOFN];intcur_size;/*当前打文件的数目*/};2.3.2主要操作函数intcreate(char*name);intopen(char*name);intclose(char*name);intwrite(intfd,char*buf,intlen);intread(intfd,char*buf);intdel(char*name);intmkdir(char*name);intrmdir(char*name);voiddir();intcd(char*name);voidprint();voidshow();第三章详细设计3.1系统分析本次设计的“模拟二级文件管理系统”利用的是二级目录管理方式,分别由用户文件目录FAT、主文件目录Root构成。其中FAT由用户的所有文件块组成,在FAT中每个用户目录文件占用一个目录项,其中目录项中包含用户名、用户密码以及指向用户文件目录文件链表的指针。3.2文件基本操作创建文件:创建一个新文件时,系统首先要为新文件申请必要的外存空间,并在FAT中为文件分配一个目录项。目录项中应记录新建文件的文件名、文件总容量、当前已经使用的容量、文件属性、文件在磁盘中的起始位置。删除文件:当已不在需要某文件时,可将它从文件系统中删除。在删除时,首先在FAT的文件链表中找到与该文件对应的文件结点,然后确认文件是否处于关闭状态,若以上条件都满足,则系统就可以把结点从文件链表中删除,然后回收改结点对应的磁盘空间。打开文件:只有处于打开状态的文件才能被读取、写入、重复关闭且不能被删除。关闭文件:只有处于关闭状态的文件才能被删除,且不能被重复关闭。列文件目录:用户只能获取自己建立的文件或其他用户共享的文件的列表,并可以查看所用户建立的文件列表。写文件:用户可以把相关数据写入到用户自定义的文件中(磁盘上);待写文件必须处于打开状态,且不能是其他用户共享的文件。读文件:用户可以把文件中存储的数据读取出来;待读文件必须处于打开状态;用户既可以读取自己建立的文件,也可以读取其他用户共享的文件。建子目录:输入目录名,若存在于该文件名相同的目录,这创建失败;若无,则查找空闲的磁盘,将该磁盘置为分配状态,填写目录项,分配地址后,子目录创建成功。删除目录:输入名字,查找是否存在该文件或目录,若为文件,则不能删除;若存在,找到起始盘块号,并将其释放,修改目录项,删除成功。3.3算法流程图框图1:程序整体框架第四章设计结果及分析4.1文件系统功能系统具有如下基本功能:login用户登录dir列目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件cd进出目录mkdir创建子目录rmdir删除子目录4.2系统测试(1)login用户登录Youhauenotformat,Doyouwantformat?<y/n>i/Successfullyformat?**************命令格孤cd目录名nltdir目录名rndir目录名dircreate文件名del文件名open玄件名close文件名readwriteexit显票*前首录的子目录H豆出豪统Root=>(2)mkdir创建子目录Root:>mkd.ipmGuccessfU.II5Fmakedirect!Root:>_(3)cd进出目录Root:>cdnRoot:\ji>⑷create创建文件(Root:Mn>create1KuccessfLillycreateafile*Root:5>_⑸close关闭文件ftoot:\m>close1successfullyclosed!Root:Xm>open打开文件Root:Sn>open1Successfullyopened?Root:Sji>_write写文件Root=Sji>wt'itePleaseinputtliefilecontect=Hello?Successfullywrite*mot=5》read读文件Root:\m>readHello?mot:\m>dir列目录Vtoot:>dirdld2d3d4<&f:>板Root:>_delete删除文件Root:>cdmRoot:1Error:Thefileisopenedj-pleasefirstcloseit?Root:^>010561Successfullyclosed?Root:5>如].1SuccessfLillydelete*Root:5>_(11)rmdir删除子目录Root:Sn>cd-.Root:>pmdii'mSuccessfullyrenouedirect?Root:>4.3运行结果分析从上述运行过程可以看出,用户登录系统后,界面将显示文件或目录的基本操作,然后根据相应操作,完成系统的基本要求。本次程序的运行结果与预期结果最终达到了一致。自运行阶段,虽然每次都能得到运行结果,但是操作界面有时不是很完美,于是通过修改程序代码,不断执行程序,进行完善,直到得出满意的操作界面为止。在该过程中,验证了本次课程设计所要求的基本功能,虽然有些操作不是很完善,但大体上都能实现。其中最令我不满意的是dir功能。该功能只是列出目录名,不能显示目录其他信息,是本次课程设计最大败笔。课程设计是对我们平时学习的一种考察,我们要正确地对待。不断地锻炼自己动手动脑的能力、把知识赋予实践就是我们学习的目标!既然学校给我们这么好的机会,让我们自己在实验室作操作,我们应该好好抓住机会,把我们平时学习的东西用自己的作品展现出来。这次,我做的是《模拟linux=^文件系统设计》的课程主题,这给了我充分锻炼的机会。我会用自己学到的东西的设计出一副好的作品。Linux系统中的文件系统是人们最感兴趣的,也是最成功的一部分。它既有很强的功能,又非常灵活,而且在具体的实现技术上也有许多独到之处,致使后来有不少操作系统的设计者都仿效了Liux操作系统中的文件系统去开发自己的文件系统。而对于我来说,这种最灵活的知识却是最难掌握的。也因为对其基本知识掌握的不好,在这一次的设计过程中遇到很多的困难,特别是物理盘块和逻辑文件之间的对应。在经过与同学进行沟通和交流并反复的测试之后,才明白了设计的函数,而且完善了部分函数的主要功能。通过两星期的操作系统课程设计实习,让我对Linux文件系统有了深层次的了解和掌握,也通过了自己的能力体会到了编程的乐趣。最重要的是学会了关于设计分析和以前C++语言学习过程中没有及时巩固的知识,对C++程序设计又有了更进一步的认识,对一些细节的结构体语句有了更深刻的理解。所以这是一次很难得的实践机会,让我真正用心编程,学到了课本以外更深刻更重要的实践经验。非常感谢老师提供这次机会,在这个课程设计过程中我受益匪浅,希望以后在这样的锻炼中不断成长,提高自己各方面的能力我相信通过我以后很加刻苦的学习,我会更加热爱我的专业课程。致谢在本次课程设计的整个过程中,要特别感谢自始至终给我提供帮助和指导的刘黎志老师,是他耐心的指导才使得本次设计得以顺得完成,同时,也要感谢其他同学的无私帮助,在此还要特别感谢为我们提供良好上机环境的学校。如果没有以上老师,同学和学校的帮助和支持,本次设计实难完成。再次感谢老师的精心辅导和同学的相互帮助,使我们顺利完成此次设计以及为学习以后的科目打下良好的基础。参考文献李小林,张俊.程序设计基础[Z].北京:中国铁道出版社,2008.汤小丹等.计算机操作系统[Z].西安:西安电子科技大学出版社,2007.严蔚敏,吴伟民.数据结构[Z].北京:清华大学出版社,2007.附录主要代码源程序:#include<stdio.h>#include<string.h>#include<stdlib.h>#defineMEM_D_SIZE1024*1024〃总磁盘空间为M#defineDISKSIZE1024//磁盘块的大小K//FAT表大小〃根目录起始盘块号〃根目录大小〃路径最大长度为KB#defineDISK_NUM1024〃磁盘块数目K〃最大子目录数〃最大文件深度为〃最大写入文字长度KB#defineFATSIZEDISK_NUM*sizeof(structfatitem)#defineROOT_DISK_NOFATSIZE/DISKSIZE+1#defineROOT_DISK_SIZEsizeof(structdirect)#defineDIR_MAXSIZE1024#defineMSD5#defineMOFN5#defineMAX//FAT表大小〃根目录起始盘块号〃根目录大小〃路径最大长度为KB〃最大子目录数〃最大文件深度为〃最大写入文字长度KBintitem;/*存放文件下一个磁盘的指针*/charem_disk;/*磁盘块是否空闲标志位0空闲*/};structdirect{/*-----文件控制快信息-----*/structFCB{charname[9];/*文件/目录名8位*/charproperty;/*属性1位目录0位普通文件*/intsize;/*文件/目录字节数、盘块数)*/intfirstdisk;/*文件/目录起始盘块号*/intnext;/*子目录起始盘块号*/intsign;/*1是根目录0不是根目录*/}directitem[MSD+2];};structopentable{structopenttableitem{charname[9];/*文件名*/intfirstdisk;/*起始盘块号*/intsize;/*文件的大小*/}openitem[MOFN];intcur_size;/*当前打文件的数目*/};structfatitem*fat;/*FAT表*/structdirect*root;/*根目录*/structdirect*cur_dir;/*当前目录*/structopentableu_opentable;/*文件打开表*/intfd=-1;/*文件打开表的序号*/char*bufferdir;/*记录当前路径的名称*/char*fdisk;/*虚拟磁盘起始地址*/voidinitfile();voidformat();voidenter();voidhalt();intcreate(char*name);intopen(char*name);intclose(char*name);intwrite(intfd,char*buf,intlen);intread(intfd,char*buf);intdel(char*name);intmkdir(char*name);intrmdir(char*name);voiddir();intcd(char*name);voidprint();voidshow();voidinitfile(){fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申请1M空间*/format();}voidformat(){inti;FILE*fp;fat=(structfatitem*)(fdisk+DISKSIZE);/*计算FAT表地址,引导区向后偏移1k)*//*-----初始化FAT表*/fat[0].item=-1;/*引导块*/fat[0].em_disk='1';for(i=1;i<ROOT_DISK_NO-1;i++)/*存放FAT表的磁盘块号*/{fat[i].item=i+1;fat[i].em_disk='1';}fat[ROOT_DISK_NO].item=-1;/*存放根目录的磁盘块号*/fat[ROOT_DISK_NO].em_disk='1';for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++){fat[i].item=-1;fat[i].em_disk='0';}/**/root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);/*根目录的地址*//*初始化目录*//*指向当前目录的目录项*/root->directitem[0].sign=1;root->directitem[0].firstdisk=ROOT_DISK_NO;strcpy(root->directitem[0].name,".");root->directitem[0].next=root->directitem[0].firstdisk;root->directitem[0].property='1';root->directitem[0].size=ROOT_DISK_SIZE;/*指向上一级目录的目录项*/root->directitem[1].sign=1;root->directitem[1].firstdisk=ROOT_DISK_NO;strcpy(root->directitem[1].name,"..");root->directitem[1].next=root->directitem[0].firstdisk;root->directitem[1].property='1';root->directitem[1].size=ROOT_DISK_SIZE;if((fp=fopen("disk.dat","wb"))==NULL){printf("Error:\nCannotopenfile\n");return;}for(i=2;i<MSD+2;i++)/*-子目录初始化为空-*/{root->directitem[i].sign=0;root->directitem[i].firstdisk=-1;strcpy(root->directitem[i].name,"");root->directitem[i].next=-1;root->directitem[i].property='0';root->directitem[i].size=0;}if((fp=fopen("disk.dat","wb"))==NULL){printf("Error:\nCannotopenfile\n");return;}if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1)/*把虚拟磁盘空间保存到磁盘文件中*/{printf("Error:\nFilewriteerror!\n");}fclose(fp);}voidenter(){FILE*fp;inti;fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申请1M空间*/if((fp=fopen("disk.dat","rb"))==NULL){printf("Error:\nCannotopenfile\n");return;}if(!fread(fdisk,MEM_D_SIZE,1,fp))/*把磁盘文件disk.dat读入虚拟磁盘空间(内存)*/{printf("Error:\nCannotreadfile\n");exit(0);}fat=(structfatitem*)(fdisk+DISKSIZE);/*找到FAT表地址*/root=(structdirect*)(fdisk+DISKSIZE+FATSIZE)/*找到根目录地址*/fclose(fp);/*初始化用户打开表*/for(i=0;i<MOFN;i++){strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk=-1;u_opentable.openitem[i].size=0;}u_opentable.cur_size=0;cur_dir=root;/*当前目录为根目录*/bufferdir=(char*)malloc(DIR_MAXSIZE*sizeof(char));strcpy(bufferdir,"Root:");}voidhalt(){FILE*fp;inti;if((fp=fopen("disk.dat","wb"))==NULL){printf("Error:\nCannotopenfile\n");return;}if(!fwrite(fdisk,MEM_D_SIZE,1,fp))/*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat*/{printf("Error:\nFilewriteerror!\n");}fclose(fp);free(fdisk);free(bufferdir);return;}intcreate(char*name){inti,j;if(strlen(name)>8)/*文件名大于8位*/return(-l);for(j=2;j<MSD+2;j++)/*检查创建文件是否与已存在的文件重名*/{if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2)/*文件已经存在*/return(-4);for(i=2;i<MSD+2;i++)/*找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2)/*无空目录项*/return(-2);if(u_opentable.cur_size>=MOFN)/*打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++)/*找到空闲盘块j后退出*/{if(fat[j].em_disk=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_disk='1';/*将空闲块置为已经分配*//*填写目录项*/strcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firstdisk=j;cur_dir->directitem[i].size=0;cur_dir->directitem[i].next=j;cur_dir->directitem[i].property='0';/**/fd=open(name);return0;}intopen(char*name){inti,j;for(i=2;i<MSD+2;i++)/*文件是否存在*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)return(-1);/*是文件还是目录*/if(cur_dir->directitem[i].property=='1')return(-4);/*——文件是否打开*/for(j=0;j<MOFN;j++){if(!strcmp(u_opentable.openitem[j].name,name))break;}if(j<MOFN)/*文件已经打开*/return(-2);if(u_opentable.cur_size>=MOFN)/*文件打开太多*/return(-3);/*查找一个空闲用户打开表项*/for(j=0;j<MOFN;j++){if(u_opentable.openitem[j].firstdisk==-1)break;}/*填写表项的相关信息*/u_opentable.openitem[j].firstdisk=cur_dir->directitem[i].firstdisk;strcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].size=cur_dir->directitem[i].size;u_opentable.cur_size++;/*返回用户打开表表项的序号*/return(j);}intclose(char*name){inti;for(i=0;i<MOFN;i++){if(!strcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)return(-1);/*清空该文件的用户打开表项的内容*/strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk=-1;u_opentable.openitem[i].size=0;u_opentable.cur_size--;return0;}intwrite(intfd,char*buf,intlen){char*first;intitem,i,j,k;intilen1,ilen2,modlen,temp;/*用$字符作为空格#字符作为换行符*/charSpace=32;charEndter='\n';for(i=0;i<len;i++){if(buf[i]=='$')buf[i]=Space;elseif(buf[i]=='#')buf[i]=Endter;}/*读取用户打开表对应表项第一个盘块号*/item=u_opentable.openitem[fd].firstdisk;/*找到当前目录所对应表项的序号*/for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp=i;/*-存放当前目录项的下标-*//*找到的item是该文件的最后一块磁盘块*/while(fat[item].item!=-1){item=fat[item].item;/*-查找该文件的下一盘块--*/}/*-----计算出该文件的最末地址——*/first=fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小——*/if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len){strcpy(first,buf);u_opentable.openitem[fd].size=u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size=cur_dir->directitem[temp].size+len;}else{for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++){/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/first[i]=buf[i];}/*——计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储*/ilen1=len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);ilen2=ilen1/DISKSIZE;modlen=ilen1%DISKSIZE;if(modlen>0)ilen2=ilen2+1;/*--还需要多少块磁盘块-*/for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM)/*--如果磁盘块已经分配完了-*/return(-1);first=fdisk+i*DISKSIZE;/*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1)/*--如果是最后要分配的一块-*/{for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)first[k]=buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k]=buf[k];}fat[item].item=i;/*--找到一块后将它的序号存放在上一块的指针中-*/fat[i].em_disk='1';/*--置找到的磁盘快的空闲标志位为已分配-*/fat[i].item=-1;/*--它的指针为-1(即没有下一块)-*/}/*--修改长度-*/u_opentable.openitem[fd].size=u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size=cur_dir->directitem[temp].size+len;}return0;}intread(intfd,char*buf){intlen=u_opentable.openitem[fd].size;char*first;inti,j,item;intilen1,modlen;item=u_opentable.openitem[fd].firstdisk;ilen1=len/DISKSIZE;modlen=len%DISKSIZE;if(modlen!=0)ilen1=ilen1+1;/*--计算文件所占磁盘的块数-*/first=fdisk+item*DISKSIZE;/*--计算文件的起始位置-*/for(i=0;i<ilen1;i++){if(i==ilen1-1)/*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j]=first。];}else/*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j]=first。];item=fat[item].item;/*-查找下一盘块-*/first=fdisk+item*DISKSIZE;}}return0;}intdel(char*name){inti,cur_item,item,temp;for(i=2;i<MSD+2;i++)/*--查找要删除文件是否在当前目录中-*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}cur_item=i;/*--用来保存目录项的序号,供释放目录中-*/if(i>=MSD+2)/*--如果不在当前目录中-*/return(-l);if(cur_dir->directitem[cur_item].property!='0')/*--如果删除的(不)是目录-*/return(-3);for(i=0;i<MOFN;i++)/*--如果文件打开,则不能删除,退出-*/{if(!strcmp(u_opentable.openitem[i].name,name))return(-2);}item=cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/while(item!=-1)/*--释放空间,将FAT表对应项进行修改-*/{temp=fat[item].item;fat[item].item=-1;fat[item].em_disk='0';item=temp;/*释放目录项*/cur_dir->directitem[cur_item].sign=0;cur_dir->directitem[cur_item].firstdisk=-1;strcpy(u_opentable.openitem[cur_item].name,"");cur_dir->directitem[cur_item].next=-1;cur_dir->directitem[cur_item].property='0';cur_dir->directitem[cur_item].size=0;return0;}intmkdir(char*name){inti,j;structdirect*cur_mkdir;if(!strcmp(name,”.”))return(-4);if(!strcmp(name,”..”))return(-4);if(strlen(name)>8)/*-如果目录名长度大于8位-*/return(-1);for(i=2;i<MSD+2;i++)/*-如果有空闲目录项退出-*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2)/*-目录/文件已满-*/return(-2);for(j=2;j<MSD+2;j++)/*-判断是否有重名-*/{if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2)/*-如果有重名-*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++)/*-找到空闲磁盘块j后退出-*/{if(fat[j].em_disk='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_disk=T;/*-将该空闲块设置为已分配-*//*填写目录项*/strcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firstdisk=j;cur_dir->directitem[i].size=ROOT_DISK_SIZE;cur_dir->directitem[i].next=j;cur_dir->directitem[i].property='1';/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/cur_mkdir=(structdirect*)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE);/*-初始化目录-*//*-指向当前目录的目录项-*/cur_mkdir->directitem[0].sign=0;cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk;strcpy(cur_mkdir->directitem[0].name,”.”);cur_mkdir->directitem[0].next=cur_mkdir->directitem[0].firstdisk;cur_mkdir->directitem[0].property='1';cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;/*-指向上一级目录的目录项-*/cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign;cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk;strcpy(cur_mkdir->directitem[1].name,”..”);cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk;cur_mkdir->directitem[1].property='1';cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;for(i=2;i<MSD+2;i++)/*-子目录都初始化为空-*/{cur_mkdir->directitem[i].sign=0;cur_mkdir->directitem[i].firstdisk=-1;strcpy(cur_mkdir->directitem[i].name,"");cur_mkdir->directitem[i].next=-1;cur_mkdir->directitem[i].property='0';cur_mkdir->directitem[i].size=0;}return0;}intrmdir(char*name){inti,j,item;structdirect*temp_dir;/*-检查当前目录项中有无该目录-*/for(i=2;i<MSD+2;i++){if(!strcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)/*-没有这个文件或目录-*/return(-1);if(cur_dir->directitem[i].property!='1')/*-删除的不是目录-*/return(-3);/*-判断要删除的目录有无子目录-*/temp_dir=(structdirect*)(fdisk+cur_dir->directitem[i].next*DISKSIZE);for(j=2;j<MSD+2;j++){if(temp_dir->directitem[j].next!=-1)break;}if(j<MSD+2)/*-有子目录或文件-*/return(-2);/*找到起始盘块号,并将其释放*/item=cur_dir->directitem[i].firstdisk;fat[item].em_disk='0';/*-修改目录项-*/cur_dir->directitem[i].sign=0;cur_dir->directitem[i].firstdisk=-1;strcpy(cur_dir->directitem[i].name,"");cur_dir->directitem[i].next=-1;cur_dir->directitem[i].property='0';cur_dir->directitem[i].size=0;return0;}voiddir(){inti;for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk!=-1)/*-如果存在子目录-*/{printf("%s\t”,cur_dir->directitem[i].name);if(cur_dir->directitem[i].property=='0')/*-文件-*/printf("%d\t\t\n”,cur_dir->directitem[i].size);elseprintf("\t<目录>\t\n");}}}intcd(char*name){inti,j,item;char*str;char*temp,*point,*point1;structdirect*temp_dir;temp_dir=cur_dir;str=name;if(!strcmp("\\”,name)){cur_dir=root;strcpy(bufferdir,"Root:");return0;}temp=(char*)malloc(DIR_MAXSIZE*sizeof(char));/*-最长路径名字分配空间-*/for(i=0;i<(int)strlen(str);i++)temp[i]=str[i];temp[i]='\0';for(j=0;j<MSD+2;j++)/*-查找该子目录是否在当前目录中-*/{if(!strcmp(temp_dir->directitem[j].name,temp))break;}free(temp);/*释放申请的临时空间*///if(temp_dir->directitem[j].property!=T)/*-打开的不是目录-*///return(-2);if(j>=MSD+2)/*-不在当前目录-*/return(-1);item=temp_dir->directitem[j].firstdisk;/*-当前目录在磁盘中位置-*/temp_dir=(structdirect*)(fdisk+item*DISKSIZE);if(!strcmp("..",name)){if(cur_dir->directitem[j-1].sign!=1)/*-如果上级目录不是根目录-*/{point=strchr(bufferdir,'\\');〃查找字符串bufferdir中首次出现字符'的位置while(point!=NULL){point1=point+1;/*-减去'\'所占的空间,记录下次查找的起始地址-*/point=strchr(point1,'\\');}*(point1-1)='\0';/*-将上一级目录删除-*/}}else{//if(name[0]!='\\')bufferdir=strcat(bufferdir,"\\");/*-修改当前目录-*/bufferdir=strcat(bufferdir,name);}cur_dir=temp_dir;/*-将当前目录确定下来-*/return0;}voidshow(){printf("%s>”,bufferdir);}voidprint(){printf("*********************************************************\n");printf("**********************文件系统设计***********************\n");printf("*\t命令格式说明*\n");printf("*\tcd目录名更改当前目录*\n");printf("*\tmkdir目录名创建子目录*\n");printf("*\trmdir目录名删除子目录*\n");printf("*\tdir显示当前目录的子目录*\n");printf("*\tcreate文件名创建文件*\n");printf("*\tdel文件名删除文件*\n");printf("*\topen文件名打开文件*\n");printf("*\tclose文件名关闭文件*\n");printf("*\tread读文件*\n");printf("*\twrite写文件*\n");printf("*\texit退出系统*\n");printf("*********************************************************\n");}voidmain(){FILE*fp;charch;chara[100];charcode[11][10];charname[10];inti,flag,r_size;char*contect;contect=(char*)malloc(MAX_WRITE*sizeof(char));if((fp=fopen("disk.dat","rb"))==NULL){printf("Youhavenotformat,Doyouwantformat?(y/n)");scanf("%c”,&ch);if(ch=='y'){initfile();printf("Successfullyformat!\n");}else{return;}}enter();print();show();strcpy(code[0],"exit");strcpy(code[1],"create");strcpy(code[2],"open");strcpy(code[3],"close");strcpy(code[4],"write");strcpy(code[5],"read");strcpy(code[6],"del");strcpy(code[7],"mkdir");strcpy(code[8],"rmdir");strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){scanf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a))break;}swit

温馨提示

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

评论

0/150

提交评论