操作系统课程设计(文件系统管理)
- 格式:doc
- 大小:267.50 KB
- 文档页数:27
操作系统课程设计-文件系统目录管理目录第一章课程设计目的和要求 (1)1 课程设计目的 (1)2 课程设计要求 (1)2.1 课程设计思想原理 (1)2.2 课程题目 (1)2.3 提交课程设计报告 (2)第二章课程设计内容 (3)1 文件管理系统结构 (3)2 文件系统采用索引文件结构 (3)2.1 磁盘模拟 (3)2.2文件的逻辑结构 (3)2.3目录结构 (3)2.4用户接口 (5)第三章详细设计 (7)1 程序功能模块图 (7)2 实体关系图 (7)3 数据流图 (8)4 数据结构设计 (8)5 程序流程图 (11)5.1 建立文件目录(mkdir)程序流程图 (11)5.2 删除文件目录(rmdir)程序流程图 (12)第四章程序运行与测试 (13)1 程序运行主界面 (13)2 用mkdir [dirname] 命令创建子目录 (13)3用ls命令显示当前目录下信息 (13)4 用rmdir [dirname] 命令删除子目录 (14)5 用cd [dirname] 命令改名当前目录 (14)第五章课程设计总结 (16)附录Ⅰ参考文献 (17)附录Ⅱ程序清单 (18)第一章课程设计目的和要求1 课程设计目的操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。
本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
2 课程设计要求2.1 课程设计思想原理阅读操作系统方面的书籍,了解操作系统的文件系统原理。
结合分析课程设计要求,确定实体以及它们之间的关系。
目 录一、基本想 .............................................. - 0 -1.1编写目的 ................................................. - 1 -1.2简单描述 ................................................. - 1 -二、公共变量及数据结构 .................................. - 1 -2.1公共变量 ................................................. - 1 -2.2数据结构 ................................................. - 1 -三、主要函数的过程描述 .................................. - 2 -3.1 路径显示 ................................................. - 2 -3.2右键快捷菜单操作 ......................................... - 3 -3.3命令窗口 ................................................. - 3 -3.4创建文本文档 ............................................. - 4 -3.5创建可执行文件 ........................................... - 4 -3.5.1指令选择 ............................................... - 4 -3.5.2已选指令删除 ........................................... - 5 -3.5.3创建可执行文件 ......................................... - 5 - 四、运行截图 ............................................ - 6 -4.1主界面 ................................................... - 6 - 4.2树形结构及右键快捷菜单 ................................... - 6 - 4.3创建文本文档 ............................................. - 7 - 4.4创建可执行文件 ........................................... - 8 - 五、使用说明 ............................................ - 8 -5.1功能说明 ................................................. - 8 -5.2操作说明 ................................................. - 8 -5.2.1快捷菜单及命令窗口 ..................................... - 8 -5.2.2创建文本文档 ........................................... - 9 -5.2.3创建可执行文件 ......................................... - 9 -5.2.4删除文件 ............................................... - 9 -六、总结 ................................................ - 9 -一、基本思想装订线1.1编写目的通过课程设计,加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能,具有初步分析实际操作系统,设计、构造和开发现代操作系统的基本能力。
评定等级操作系统课程设计文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制文件系统管理一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。
通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。
二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。
在用户程序中通过使用文件系统提供的create,open,read,write,close,delete 等文件命令,对文件进行操作。
以下报告主要包括:1.可行性分析2.需求分析3.概要设计4.详细设计5.测试6.总结三、可行性分析1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。
利用大二期间学习的数据结构可以模拟出此课程设计的要求。
2、经济可行性课程设计作为本课程的练习及进一步加深理解。
与经济无关,可以不考虑。
(零花费,零收益)3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。
四、需求分析编写程序实现文件系统,主要有以下几点要求:1、实现无穷级目录管理及文件管理基本操作2、实现共享“别名”3、加快了文件检索五、概要设计为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD (User File Directory )。
这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。
此外,在系统中再建立一个主文件目录MFD (Master File Directory );在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。
本设计主要实现下面几个数据结构:M D F U F D A F D 用户名文件名打开文件名文件目录指针保护码打开保护码用户名文件长度读写指针文件目录指针文件名···总体的流程图如下:六、详细设计主要数据结构:1.MFD (Master File Directory ),主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。
操作系统课程设计-文件系统一、引言文件系统是操作系统中的重要组成部分,负责对计算机中的文件进行管理和组织。
在操作系统课程设计中,文件系统的设计和实现是一个重要的任务。
本文将介绍文件系统的设计原则、功能和实现过程。
二、设计原则1. 可靠性文件系统需要确保数据的可靠性,能够有效地进行错误检测和纠正。
它应该能够处理文件的损坏、删除或丢失等情况,并能够进行数据恢复。
2. 效率文件系统需要具备高效的存取和查找功能,能够在较短的时间内完成对文件的操作。
它应该对文件进行良好的组织和管理,以提高文件的读写速度。
3. 安全性文件系统要能够保护文件的机密性和完整性,确保只有授权用户才能访问文件,并防止数据被恶意篡改或破坏。
4. 可扩展性文件系统应该能够适应不同容量和规模的存储设备,并能够随着存储需求的增长而进行扩展。
三、功能1. 存储管理文件系统需要对存储设备进行管理,包括磁盘空间的分配、回收和整理等操作,确保文件能够高效地存储和读取。
2. 目录管理文件系统需要提供目录管理功能,能够对文件进行组织和分类。
用户可以根据目录结构查找和管理文件,方便文件的查找和访问。
3. 文件操作文件系统需要支持各种文件操作,包括创建、删除、打开、关闭、读取和写入等操作。
它应该提供一组接口供用户和应用程序使用。
4. 错误处理文件系统需要对各种错误情况进行处理,包括磁盘故障、读写错误和用户操作错误等。
它应该能够识别和纠正错误,并提供相应的错误提示和恢复机制。
四、实现过程1. 文件分配文件系统需要确定如何将磁盘空间分配给文件,以实现高效的存储和检索。
常见的文件分配方式包括连续分配、链式分配和索引分配等。
2. 目录结构文件系统需要设计合适的目录结构,以方便用户查找和管理文件。
常见的目录结构包括树状目录结构、索引节点和哈希表等。
3. 文件读写文件系统需要实现高效的文件读写功能,包括将文件从磁盘读入内存和将文件从内存写入磁盘。
它应该提供缓存机制来加速读写操作。
操作系统课程设计文件管理系统1. 引言文件管理是操作系统中的一个重要模块,负责对计算机中的文件进行管理和组织。
在操作系统课程设计中,设计一个文件管理系统是一个很有挑战性的任务,需要考虑到文件的创建、打开、读取、写入、删除等功能,并且要确保文件的安全性和可靠性。
本文将详细介绍文件管理系统的设计与实现。
2. 需求分析为了满足用户对文件管理的需要,我们需要对文件管理系统的需求进行分析。
在这个文件管理系统中,用户应该能够执行以下操作:•文件的创建和命名•文件的打开和关闭•文件的读取和写入•文件的删除和修改•文件的搜索和查找除此之外,还要考虑到对文件权限的管理,可以设置不同用户对文件的不同访问权限,以保障文件的安全性。
3. 概要设计概要设计是对文件管理系统的整体架构和功能进行规划和设计。
文件管理系统可以采用层次结构的设计方式,分为用户界面、文件管理模块和存储管理模块。
3.1 用户界面用户界面是用户与文件管理系统进行交互的接口,可以通过命令行或者图形界面来实现。
在用户界面中,用户可以输入相关指令来执行对文件的操作,如创建文件、打开文件、读取文件等。
3.2 文件管理模块文件管理模块是文件管理系统的核心模块,负责对文件进行创建、打开、读取、写入、删除等操作。
在文件管理模块中,需要维护一个文件目录表来记录文件的基本信息,如文件名、文件大小、文件权限等。
还需要考虑到文件的分配和回收,可以使用位示图等方式进行实现。
3.3 存储管理模块存储管理模块负责对文件进行存储和管理,包括磁盘空间的分配和回收。
在存储管理模块中,可以采用文件分配表或者索引节点进行存储方式的选择。
4. 详细设计在详细设计阶段,需要对概要设计中的每个模块进行详细设计,并确定各个模块之间的接口和数据结构。
4.1 用户界面设计用户界面设计可以采用命令行方式进行实现。
用户可以通过命令输入来执行相应的文件管理操作。
可以设计一系列命令,如create用于创建文件,open用于打开文件,read用于读取文件等。
文件管理linux课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握Linux操作系统的基本概念、文件管理的原理和常用命令。
技能目标要求学生能够熟练使用Linux命令行进行文件管理,包括文件创建、删除、移动、复制、权限设置等操作。
情感态度价值观目标要求学生培养对计算机科学的兴趣,提高自主学习和解决问题的能力。
通过本课程的学习,学生将了解Linux操作系统的特点和应用场景,掌握文件管理的基本原理和常用命令,培养良好的计算机操作习惯和自主学习能力。
二、教学内容本课程的教学内容主要包括Linux操作系统的基本概念、文件管理的原理和常用命令。
首先,介绍Linux操作系统的发展历程、特点和应用场景,使学生对Linux有一定的了解。
然后,讲解文件管理的基本原理,包括文件系统的结构、文件权限和文件属性等。
接着,介绍常用文件管理命令,如创建、删除、移动、复制、权限设置等,并通过实际操作演示这些命令的使用方法。
教学内容将按照以下大纲进行安排:1.Linux操作系统简介2.文件系统结构3.文件权限和属性4.常用文件管理命令5.文件操作实战演练三、教学方法本课程将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。
首先,通过讲授法向学生传授Linux操作系统的基本概念和文件管理的原理。
然后,通过讨论法引导学生进行思考和交流,提高学生对文件管理命令的理解和应用能力。
接着,通过案例分析法分析实际问题,让学生学会如何运用文件管理命令解决问题。
最后,通过实验法让学生亲自动手操作,巩固所学知识,提高实际操作能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
教材将提供Linux操作系统的基本概念和文件管理的原理,参考书将提供更深入的知识和实用技巧。
多媒体资料将包括PPT演示和视频教程,帮助学生更好地理解和掌握知识。
实验设备将用于让学生亲自动手操作,提高实际操作能力。
模拟操作系统—文件管理1.1设计目的:通过模拟操作系统的实现,加深对操作系统工作原理的理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力2.1设计原理:2.1.1文件管理和用户接口:文件管理和用户接口部分实现的主要是单用户的磁盘管理部分,包括文件的逻辑结构,物理结构,目录,磁盘分配回收,文件的保护和用户的接口实现。
系统中有2种文件,一种是存放任意字符的文件,一种是用来存放可以执行的文件,可以执行的文件内容就是模拟系统内进程的程序体。
文件要有一种特定的命令的可以执行的文件(可以建立一个 .exe文件里面写指令)他的内容很简单,就是:x=?;给X赋一个值(一位数),x++;X--;!??(第一个?为ABC中某个设备,第二个?为一位数,表示设备的时间(由于没有实际设备,所以无法知道设备何时工作完成,所以假如一个数,随着数的系统时间减少到0结束));end(表示文件结束,同时写入文件out,包括文件名字和路径和X的值)。
用户接口:用户接口提供用户命令接口,创建文件,删除文件,复制文件,粘贴文件,显示文件,编辑文件,建立目录,删除空目录,删除目录等等。
2.1.2磁盘模拟:用一个文件disk模拟磁盘,磁盘的每一个块64个字节,模拟磁盘工128个块,第0,1块存放文件分配表,第2个存放根目录,期于存放子目录和文件。
磁盘分配磁盘分配采用链式结构,系统采用文件分配表的方式记录磁盘空间的使用情况和链式结构的指针。
2.1.3目录内容:目录内容才用树型目录结构(1)目录项内容:8个字节:目录名,文件名(3个字节),扩展名(1个字节),末路。
文件属性(1个字节),起始磁盘号(1个字节),文件长度(2个字节),(2)根目录:根目录位置固定,为磁盘第2块,大小固定,工8项,站用第2块。
(3)子目录:位置不变,大小不固定。
2.1.4.存储管理:存储管理部分主要实现贮存和空间的分配和回收,存储的保护。
c 文件管理系统课程设计。
一、课程目标知识目标:1. 让学生掌握文件管理系统的基本概念,如文件、文件夹、路径等。
2. 使学生了解文件系统的组织结构,如树状结构、目录层级等。
3. 帮助学生理解文件存储的基本原理,如磁盘空间分配、文件存取速度等。
技能目标:1. 培养学生能够熟练使用文件管理器进行文件创建、复制、移动、删除等操作。
2. 让学生学会利用文件系统进行文件分类、整理、备份和恢复。
3. 培养学生具备简单的文件系统故障排查和处理能力。
情感态度价值观目标:1. 培养学生对计算机文件管理的兴趣,提高学习积极性。
2. 培养学生养成良好的文件管理习惯,如分类存放、定期备份等。
3. 培养学生的团队合作意识,学会在小组讨论中分享观点、倾听他人意见。
课程性质:本课程为信息技术课程,旨在让学生掌握文件管理的基本知识和技能,提高信息素养。
学生特点:本课程针对的是初中年级学生,他们对计算机有一定的基础,好奇心强,但注意力容易分散。
教学要求:结合学生特点,教师应采用生动有趣的教学方法,注重实践操作,引导学生主动探究,确保课程目标的实现。
在教学过程中,关注学生的个体差异,及时给予指导和鼓励,使学生在完成具体学习成果的过程中,不断提高自身能力。
二、教学内容1. 文件管理基础- 文件与文件夹概念- 文件系统组织结构- 文件存储原理2. 文件管理操作- 文件创建、复制、移动、删除- 文件夹创建、重命名、属性修改- 文件搜索与排序3. 文件管理技巧- 文件分类与整理- 文件备份与恢复- 文件系统优化4. 文件管理故障处理- 磁盘空间不足- 文件丢失与误删- 文件权限与共享问题教学内容安排与进度:第一课时:文件管理基础第二课时:文件管理操作第三课时:文件管理技巧第四课时:文件管理故障处理教材章节关联:本教学内容与教材中“文件与文件夹管理”章节相关,涵盖了该章节的核心知识点和操作技能。
通过本课程的学习,学生可以系统地掌握文件管理的相关知识,提高实际操作能力。
操作系统原理课程设计文件管理系统院系:计算机学院三系班级:计软05 – 1班姓名:韩宇学号: 3 5 号指导教师:李益民2007 年7 月4 日操作系统原理课程设计任务书一、题目:文件系统管理二、设计要求(1)由鲁建成,韩宇,肖鹏完成设计与实现。
(2)查阅相关资料,自学具体课题中涉及到的新知识。
(3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。
(4)所设计的程序应有输入、输出。
一.(5)按要求写出课程设计报告,并于设计结束后1周内提交。
其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、需求分析、概要设计、详细设计、软件的调试、总结、启谢、附录:带中文注释的程序清单、参考文献。
报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。
总体设计应配合软件总体模块结构图来说明软件应具有的功能。
详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。
四、课程设计工作计划2007年6月18日,指导教师讲课,学生根据题目准备资料;2007年6月19日,进行总体方案设计;2007年6月20日~2007年6月25日,完成程序模块并通过独立编译;2007年6月26日~2007年6月27日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2007年6月27日~2007年6月29日,验收、撰写报告;2007年6月29日下午,验收或总结。
指导教师签章:教研室主任签章操作系统原理课程设计指导教师评语与成绩目录一概述------------------------------------------------------------5二需求分析------------------------------------------------------71)问题获取2)分析三概要设计------------------------------------------------------8 四详细设计------------------------------------------------------91)具体功能概述2)程序流程图3)程序代码五程序的调试与运行结果说明------------------------------32六用户使用说明------------------------------------------------351)引言2)功能介绍七启谢-------------------------------------------------------------36八参考资料-------------------------------------------------------36一概述1.课程设计的目的1.理解重要数据结构的意义2.掌握文件系统的工作原理3.通过本次课程设计加深文件系统内部功能及内部实现的理解2.课程设计的要求1.需要的基本知识:文件:一组带标志的在逻辑上有完整意义的信息项的序列,这个标识为文件名。
操作系统文件管理系统课程设计
操作系统文件管理系统课程设计一般包括以下内容:
1. 基本概念和原理:介绍文件管理系统的基本概念和原理,包括文件、目录、文件系统、文件操作等。
2. 设计需求分析:明确设计需求,包括基本功能、用户需求、性能要求等。
3. 文件存储结构的设计:设计文件存储结构,包括文件分配方式、文件存储结构、文件目录结构、文件保护等。
4. 文件操作的实现:实现文件的创建、打开、读写、删除等基本操作,以及文件的复制、移动、重命名等高级操作。
5. 目录管理的实现:实现目录的创建、删除、重命名等操作,以及目录的遍历和搜索等功能。
6. 文件系统的实现:实现文件系统的格式化、挂载、卸载等操作,以及文件系统的安全性和可靠性保障。
7. 用户界面的设计:设计用户界面,包括命令行界面和图形界面,以方便用户进行文件管理操作。
8. 系统测试和调试:对系统进行测试和调试,包括单元测试、集成测试、性能测试等,以确保系统的稳定性和可靠性。
9. 报告撰写和展示:根据课程设计的要求,编写设计报告和展示文稿,介绍系统的设计思路、实现方法和成果。
以上是一个基本的操作系统文件管理系统课程设计的内容,具体可以根据教师的要求和课程的安排进行适当调整和扩展。
课程设计文件系统使用一、教学目标本课程的目标是使学生掌握文件系统的基本概念、原理和实用技巧。
通过本课程的学习,学生应能够:1.知识目标:理解文件系统的基本概念,包括文件、目录、磁盘空间管理等;掌握文件系统的常用命令和操作,如文件创建、删除、复制、移动等。
2.技能目标:能够独立完成文件系统的日常管理和维护工作,如磁盘碎片整理、文件备份和恢复等;能够根据实际需要,定制个性化的文件管理系统。
3.情感态度价值观目标:培养学生对文件系统重要性的认识,使学生能够自觉地维护和合理地使用文件系统,提高工作效率和生活品质。
二、教学内容本课程的教学内容主要包括以下几个部分:1.文件系统概述:介绍文件系统的基本概念、原理和功能,使学生对文件系统有一个整体的认识。
2.文件系统的常用命令和操作:详细讲解文件系统的常用命令和操作,并通过实际操作使学生熟练掌握。
3.文件系统的管理和维护:介绍文件系统的管理和维护方法,如磁盘空间管理、文件备份和恢复等,使学生能够独立完成文件系统的日常管理和维护工作。
4.文件系统的定制:讲解如何根据实际需要,定制个性化的文件管理系统,提高工作效率。
三、教学方法本课程的教学方法主要包括讲授法、操作演示法、案例分析法和讨论法等。
1.讲授法:通过讲解文件系统的基本概念、原理和功能,使学生对文件系统有一个整体的认识。
2.操作演示法:通过实际操作演示,使学生熟练掌握文件系统的常用命令和操作。
3.案例分析法:通过分析实际案例,使学生了解文件系统的管理和维护方法,以及如何定制个性化的文件管理系统。
4.讨论法:通过分组讨论,激发学生的学习兴趣,培养学生的独立思考和解决问题的能力。
四、教学资源本课程的教学资源主要包括教材、多媒体资料和实验设备等。
1.教材:选用权威、实用的教材,为学生提供系统的文件系统知识。
2.多媒体资料:制作精美的多媒体课件,辅助讲解文件系统的概念和操作。
3.实验设备:提供足够的实验设备,使学生能够进行实际操作,巩固所学知识。
课程设计任务书计算机科学与技术专业年级班一、设计题目文件管理系统设计二、主要内容设计一个简单的文件管理系统来模拟文件操作命令的执行三、具体要求设计和调试一个简单的文件管理系统来模拟文件管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法。
具体要求如下:⑴设计一个支持n个用户的文件系统,每个用户可拥有多个文件;⑵采用二级或二级以上的多级文件目录管理;⑶对文件应设置存取控制保护方式,如“只能执行”、“允许读”、“允许写”等;⑷系统的外部特征应接近于真实系统,可设置下述文件操作命令:建立文件、打开文件、关闭文件、删除文件、读文件、写文件、复制文件、查询目录。
⑸通过键盘(或鼠标)使用该文件系统,系统应显示操作命令的执行结果。
四、进度安排2012-9-3-----2012-9-6 确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;2012-9-6-----2012-9-12 编写程序代码并调试,再将调试通过的各个子模块进行集成调试;2012-2-12----2012-9-16 归纳文档资料,完成课程设计说明书,参加课程设计答辩五、完成后应上交的材料在课程设计完成后需要提交的成果和有关文档资料包括:1、课程设计的说明书。
2、课程设计有关源程序及可运行程序(光盘或电子邮件)。
六、总评成绩:指导教师签名日期年月日系主任审核日期年月日一、本设计目的及基本思想本课程设计目的是实现树型目录结构文件系统,在实现过程中利用了二叉树,其中每个节点都有父指针,子指针和兄弟指针,其中子指针指向该目录下的第一个子节点,而该子节点的父指针则指向它的上级目录。
目录下各子节点用兄弟指针连接起来。
文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛出。
文件打开则把文件的名称及其父指针写到文件列表同时置文件打开标志为1,文件关闭则把文件从打开列表中删除,同时置文件打开指针为0,文件读取和写入都要检查文件是否在文件打开列表中,未打开文件不能读写,只读文件不能写,只写文件不能读。
目录一、课程设计题目和目的...................................... 错误!未定义书签。
二、开发工具及环境.......................................... 错误!未定义书签。
三、课程设计要求............................................ 错误!未定义书签。
四、程序设计思想............................................ 错误!未定义书签。
五、文件系统的实现.......................................... 错误!未定义书签。
六、操作说明 (5)七、程序运行结果 (10)八、参考文献 (15)九、心得体会 (15)一、课程设计题目和目的本设计的目的是通过设计和调试一个简单的文件系统,主要是模拟文件操作命令的执行,来模拟文件管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法。
二、开发工具及环境a)程序设计语言:C++b)计算机及操作系统:PC机,WindowsXPc)开发平台:Microsoft Visual C++ 6.0d)运行平台:PC机,WindowsXP三、课程设计要求具体要求如下:⑴设计一个支持n个用户的文件系统,每个用户可拥有多个文件;⑵采用二级或二级以上的多级文件目录管理;⑶对文件应设置存取控制保护方式,如“只能执行”、“允许读”、“允许写”等;⑷系统的外部特征应接近于真实系统,可设置下述文件操作命令:建立文件、打开文件、关闭文件、删除文件、读文件、写文件、复制文件、查询目录。
⑸通过键盘使用该文件系统,系统应显示操作命令的执行结果。
四、程序设计思想1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
操作【2 】体系课程设计报告小组编号: 小构成员:一.课程设计概述:1.标题: 简略文件体系的实现2.实现内容(1)在内存中开拓一个虚拟磁盘空间作为文件存储分区,在其上实现一个简略的基于多级目次的单用户单义务体系中的文件体系.在退出该文件体系的应用时,应将该虚拟文件体系以一个Windows 文件的方法保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中.(2)文件存储空间的分派可采用显式链接分派或其他的方法.(3)余暇磁盘空间的治理可选择位示图或其他的方法.假如采用位示图来治理文件存储空间,并采用显式链接分派方法,那么可以将位示图归并到FAT中.(4)文件目次构造采用多级目次构造.为了简略起见,可以不应用索引结点,个中的每个目次项应包含文件名.物理地址.长度等信息,还可以经由过程目次项实现对文件的读和写的破坏.●请求供给以下操作敕令:●my_format: 对文件存储器进行格局化,即按照文件体系的构造对虚拟磁盘空间进行布局,并在其上创建根目次以及用于治理文件存储空间等的数据构造.●my_mkdir: 用于创建子目次.●my_rmdir: 用于删除子目次.●my_ls: 用于显示目次中的内容.●my_cd: 用于更改当前目次.●my_create: 用于创建文件.●my_open: 用于打开文件.●my_close: 用于封闭文件.●my_write: 用于写文件.●my_read: 用于读文件.●my_rm: 用于删除文件.二、my_exitsys: 用于退出文件体系.设计思绪(重要算法描写.程序流程图等):1. 体系主函数main()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: void main()(4)功效: 体系主函数(5)输入: 无(6)输出: 无(7)函数需完成的工作:①对前面界说的全局变量进行初始化;②挪用startsys()进入文件体系;③列出文件体系供给的各项功效及敕令挪用格局;④显示敕令行提醒符,等待用户输入敕令;⑤将用户输入的敕令保存到一个buf中;⑥对buf中的内容进行敕令解析,并挪用响应的函数履行用户键入的敕令;⑦假如敕令不是“my_exitsys”,则敕令履行完毕后转④.2.进入文件体系函数startsys()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: void startsys()(4)功效: 由main()函数挪用,进入并初始化我们所树立的文件体系,以供用户应用.(5)输入: 无(6)输出: 无.(7)函数需完成的工作:①申请虚拟磁盘空间;②应用c说话的库函数fopen()打开myfsys文件: 若文件消失,则转③;若文件不消失,则创建之,转⑤③应用c说话的库函数fread()读入myfsys文件内容到用户空间中的一个缓冲区中,并断定其开端的8个字节内容是否为“10101010”(文件体系魔数),假如是,则转④;不然转⑤;④将上述缓冲区中的内容复制到内存中的虚拟磁盘空间中;转⑦⑤在屏幕上显示“myfsys文件体系不消失,如今开端创建文件体系”信息,并挪用my_format()对①中申请到的虚拟磁盘空间进行格局化操作.转⑥;⑥将虚拟磁盘中的内容保存到myfsys文件中;转⑦⑦应用c说话的库函数fclose()封闭myfsys文件;⑧初始化用户打开文件表,将表项0分派给根目次文件应用,并填写根目次文件的相干信息,因为根目次没有上级目次,所以表项中的dirno和diroff分离置为5(根目次地点肇端块号)和0;并将ptrcurdir指针指向该用户打开文件表项.⑨将当前目次设置为根目次.3. 磁盘格局化函数my_format()(1)对应敕令: my_format(2)敕令挪用格局: my_format(3)函数设计格局: void my_format()(4)功效: 对虚拟磁盘进行格局化,布局虚拟磁盘,树立根目次文件(或根目次区).(5)输入: 无(6)输出: 无.(7)函数需完成的工作:①将虚拟磁盘第一个块作为引诱块,开端的8个字节是文件体系的魔数,记为“10101010”;在之后写入文件体系的描写信息,如FAT表大小及地位.根目次大小及地位.盘块大小.盘块数目.数据区开端地位等信息;②在引诱块后树立两张完全一样的FAT表,用于记载文件所占领的磁盘块及治理虚拟磁盘块的分派,每个FAT占领两个磁盘块;对于每个FAT中,前面5个块设置为已分派,后面995个块设置为余暇;③在第二张FAT后创建根目次文件root,将数据区的第1块(即虚拟磁盘的第6块)分派给根目次文件,在该磁盘上创建两个特别的目次项: “.”和“..”,其内容除了文件名不同之外,其他字段完全雷同.4. 更改当前目次函数my_cd()(1)对应敕令: my_cd(2)敕令挪用格局: my_cd dirname(3)函数设计格局: void my_cd(char *dirname)(4)功效: 转变当前目次到指定的名为dirname的目次.(5)输入:dirname: 新的当前目次的目次名;(6)输出: 无(7)函数需完成的工作:①挪用my_open()打开指定目次名的父目次文件,并挪用do_read()读入该父目次文件内容到内存中;②在父目次文件中检讨新的当前目次名是否消失,假如消失则转③,不然返回,并显示出错信息;③挪用my_close()封闭①中打开的父目次文件;④挪用my_close()封闭原当前目次文件;⑤假如新的当前目次文件没有打开,则打开该目次文件;并将ptrcurdir指向该打开文件表项;⑥设置当前目次为该目次.5. 创建子目次函数my_mkdir()(1)对应敕令: my_mkdir(2)敕令挪用格局: my_ mkdir dirname(3)函数设计格局: void my_mkdir(char *dirname)(4)功效: 在当前目次下创建名为dirname的子目次.(5)输入:dirname:新建目次的目次名.(6)输出: 无.(7)函数需完成的工作:①挪用do_read()读入当前目次文件内容到内存,检讨当前目次下新建目次文件是否重名,若重名则返回,并显示错误信息;②为新建子目次文件分派一个余暇打开文件表项,假如没有余暇表项则返回-1,并显示错误信息;③检讨FAT是否有余暇的盘块,如有则为新建目次文件分派一个盘块,不然释放①平分派的打开文件表项,返回,并显示错误信息;④在当前目次中为新建目次文件查找一个余暇的目次项或为其追加一个新的目次项;需修正当前目次文件的长度信息,并将当前目次文件的用户打开文件表项中的fcbstate置为1;⑤预备好新建目次文件的FCB的内容,文件的属性为目次文件,以笼罩写方法挪用do_write()将其填写到对应的空目次项中;⑥在新建目次文件所分派到的磁盘块中树立两个特别的目次项“.”和“..”目次项,方法是: 起首在用户空间中预备好内容,然后以截断写或者笼罩写方法挪用do_write()将其写到③平分派到的磁盘块中;⑦返回.6. 删除子目次函数rmdir()(1)对应敕令: my_ rmdir(2)敕令挪用格局: my_ rmdir dirname(1)函数设计格局: void my_rmdir(char *dirname)(2)功效: 在当前目次下删除名为dirname的子目次.(3)输入:dirname:欲删除目次的目次名.(4)输出: 无.(5)函数需完成的工作:①挪用do_read()读入当前目次文件内容到内存,检讨当前目次下欲删除目次文件是否消失,若不消失则返回,并显示错误信息;②检讨欲删除目次文件是否为空(除了“.”和“..”外没有其他子目次和文件),可依据其目次项中记载的文件长度来断定,若不为空则返回,并显示错误信息;③检讨该目次文件是否已经打开,若已打开则挪用my_close()封闭掉落;④收受接管该目次文件所占领的磁盘块,修正FAT;⑤从当前目次文件中清空该目次文件的目次项,且free字段置为0: 以笼罩写方法挪用do_write()来实现;⑥修正当前目次文件的用户打开表项中的长度信息,并将表项中的fcbstate置为1;⑦返回.7. 显示目次函数my_ls()(1)对应敕令: my_ls(2)敕令挪用格局: my_ls(3)函数设计格局: void my_ls(void)(4)功效: 显示当前目次的内容(子目次和文件信息).(5)输入: 无(6)输出: 无(7)函数需完成的工作:①挪用do_read()读出当前目次文件内容到内存;②将读出的目次文件的信息按照必定的格局显示到屏幕上;③返回.8. 创建文件函数my_create()(1)对应敕令: my_create(2)敕令挪用格局: my_create filename(3)函数设计格局: int my_create (char *filename)(4)功效: 创建名为filename的新文件.(5)输入:filename:新建文件的文件名,可能包含路径.(6)输出: 若创建成功,返回该文件的文件描写符(文件打开表中的数组下标);不然返回-1.(7)函数需完成的工作:①为新文件分派一个余暇打开文件表项,假如没有余暇表项则返回-1,并显示错误信息;②若新文件的父目次文件还没有打开,则挪用my_open()打开;若打开掉败,则释放①中为新建文件分派的余暇文件打开表项,返回-1,并显示错误信息;③挪用do_read()读出该父目次文件内容到内存,检讨该目次下新文件是否重名,若重名则释放①平分派的打开文件表项,并挪用my_close()封闭②中打开的目次文件;然后返回-1,并显示错误信息;④检讨FAT是否有余暇的盘块,如有则为新文件分派一个盘块,不然释放①平分派的打开文件表项,并挪用my_close()封闭②中打开的目次文件;返回-1,并显示错误信息;⑤在父目次中为新文件查找一个余暇的目次项或为其追加一个新的目次项;需修正该目次文件的长度信息,并将该目次文件的用户打开文件表项中的fcbstate置为1;⑥预备好新文件的FCB的内容,文件的属性为数据文件,长度为0,以笼罩写方法挪用do_write()将其填写到⑤平分派到的空目次项中;⑦为新文件填写①平分派到的余暇打开文件表项,fcbstate字段值为0,读写指针值为0;⑧挪用my_close()封闭②中打开的父目次文件;⑨将新文件的打开文件表项序号作为其文件描写符返回.9. 删除文件函数my_rm()(1)对应敕令: my_rm(2)敕令挪用格局: my_rm filename(3)函数设计格局: void my_rm(char *filename)(4)功效: 删除名为filename的文件.(5)输入:filename:欲删除文件的文件名,可能还包含路径.(6)输出: 无.(7)函数需完成的工作:①若欲删除文件的父目次文件还没有打开,则挪用my_open()打开;若打开掉败,则返回,并显示错误信息;②挪用do_read()读出该父目次文件内容到内存,检讨该目次下欲删除文件是否消失,若不消失则返回,并显示错误信息;③检讨该文件是否已经打开,若已打开则封闭掉落;④收受接管该文件所占领的磁盘块,修正FAT;⑤从文件的父目次文件中清空该文件的目次项,且free字段置为0: 以笼罩写方法挪用do_write()来实现;;⑥修正该父目次文件的用户打开文件表项中的长度信息,并将该表项中的fcbstate置为1;⑦返回.10. 打开文件函数my_open()(1)对应敕令: my_open(2)敕令挪用格局: my_open filename(3)函数设计格局: int my_open(char *filename)(4)功效: 打开当前目次下名为filename的文件.(5)输入:filename: 欲打开文件的文件名(6)输出: 若打开成功,返回该文件的描写符(在用户打开文件表中表项序号);不然返回-1.(7)函数需完成的工作:①检讨该文件是否已经打开,若已打开则返回-1,并显示错误信息;②挪用do_read()读出父目次文件的内容到内存,检讨该目次下欲打开文件是否消失,若不消失则返回-1,并显示错误信息;③检讨用户打开文件表中是否有空表项,如有则为欲打开文件分派一个空表项,若没有则返回-1,并显示错误信息;④为该文件填写空白用户打开文件表表项内容,读写指针置为0;⑤将该文件所分派到的空白用户打开文件表表项序号(数组下标)作为文件描写符fd返回.11. 封闭文件函数my_close()(1)对应敕令: my_close(2)敕令挪用格局: my_close fd(3)函数设计格局: void my_close(int fd)(4)功效: 封闭前面由my_open()打开的文件描写符为fd的文件.(5)输入:fd:文件描写符.(6)输出: 无.(7)函数需完成的工作:①检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1;②检讨用户打开文件表表项中的fcbstate字段的值,假如为1则须要将该文件的FCB的内容保存到虚拟磁盘上该文件的目次项中,方法是: 打开该文件的父目次文件,以笼罩写方法挪用do_write()将欲封闭文件的FCB 写入父目次文件的响应盘块中;③收受接管该文件占领的用户打开文件表表项(进行清空操作),并将topenfile字段置为0;④返回.12. 写文件函数my_write()(1)对应敕令: my_write(2)敕令挪用格局: my_write fd(3)函数设计格局: int my_write(int fd)(4)功效: 将用户经由过程键盘输入的内容写到fd所指定的文件中.磁盘文件的读写操作都必须以完全的数据块为单位进行,在写操作时,先将数据写在缓冲区中,缓冲区的大小与磁盘块的大小雷同,然后再将缓冲区中的数据一次性写到磁盘块中;读出时先将一个磁盘块中的内容读到缓冲区中,然后再传送到用户区.本实例为了轻便起见,没有设置缓冲区治理,只是在读写文件时由用户应用malloc()申请一块空间作为缓冲区,读写操作停止后应用free()释放掉落.写操作常有三种方法: 截断写.笼罩写和追加写.截断写是废弃本来文件的内容,从新写文件;笼罩写是修正文件在当前读写指针所指的地位开端的部分内容;追加写是在原文件的最后添加新的内容.在本实例中,输入写文件敕令后,体系会消失提醒让用户选择个中的一种写方法,并将随后键盘输入的内容按照所选的方法写到文件中,键盘输入内容经由过程CTR+Z键(或其他设定的键)停止.(5)输入:fd: open()函数的返回值,文件的描写符;(6)输出: 现实写入的字节数.(7)函数需完成的工作:①检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1,并显示出错信息;②提醒并等待用户输入写方法: (1: 截断写;2: 笼罩写;3: 追加写)③假如用户请求的写方法是截断写,则释放文件除第一块外的其他磁盘空间内容(查找并修正FAT表),将内存用户打开文件表项中文件长度修正为0,将读写指针置为0并转④;假如用户请求的写方法是追加写,则修正文件的当前读写指针地位到文件的末尾,并转④;假如写方法是笼罩写,则直接转④;④提醒用户: 全部输入内容经由过程CTR+Z键(或其他设定的键)停止;用户可分多次输入写入内容,每次用回车停止;⑤等待用户从键盘输入文件内容,并将用户的本次输入内容保存到一暂时变量text[]中,请求每次输入以回车停止,全体停止用CTR+Z键(或其他设定的键);⑥挪用do_write()函数将经由过程键盘键入的内容写到文件中.⑦假如do_write()函数的返回值为非负值,则将现实写入字节数增长do_write()函数返回值,不然显示出错信息,并转⑨;⑧假如text[]中最后一个字符不是停止字符CTR+Z,则转⑦持续进行写操作;不然转⑨;⑨假如当前读写指针地位大于用户打开文件表项中的文件长度,则修正打开文件表项中的文件长度信息,并将fcbstate置1;⑩返回现实写入的字节数.13. 现实写文件函数do_write()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: int my_write(int fd,char *text,int len,char wstyle)(4)功效: 被写文件函数my_write()挪用,用来将键盘输入的内容写到响应的文件中去.(5)输入:fd: open()函数的返回值,文件的描写符;text: 指向要写入的内容的指针;len: 本次请求写入字节数wstyle: 写方法(6)输出: 现实写入的字节数.(7)函数需完成的工作:①用malloc()申请1024B的内存空间作为读写磁盘的缓冲区buf,申请掉败则返回-1,并显示出错信息;②将读写指针转化为逻辑块块号和块内偏移off,并应用打开文件表表项中的首块号及FAT表的相干内容将逻辑块块号转换成对应的磁盘块块号blkno;假如找不到对应的磁盘块,则须要检索FAT为该逻辑块分派一新的磁盘块,并将对应的磁盘块块号blkno登记到FAT中,若分派掉败,则返回-1,并显示出错信息;③假如是笼罩写,或者假如当前读写指针所对应的块内偏移off不等于0,则将块号为blkno的虚拟磁盘块全体1024B的内容读到缓冲区buf中;不然便用ASCII码0清空buf;④将text中未写入的内容暂存到缓冲区buff的第off字节开端的地位,直到缓冲区满,或者吸收到停止字符CTR+Z为止;将本次写入字节数记载到tmplen中;⑤将buf中1024B的内容写入到块号为blkno的虚拟磁盘块中;⑥将当前读写指针修正为本来的值加上tmplen;并将本次现实写入的字节数增长tmplen;⑦假如tmplen小于len,则转②持续写入;不然转⑧;⑧返回本次现实写入的字节数.14. 读文件函数my_read()(1)对应敕令: my_read(2)敕令挪用格局: my_read fd len(3)函数设计格局: int myread (int fd, int len)(4)功效: 读出指定文件中从读写指针开端的长度为len的内容到用户空间中.(5)输入:fd: open()函数的返回值,文件的描写符;len: 要从文件中读出的字节数.(6)输出: 现实读出的字节数.(7)函数需完成的工作:①界说一个字符型数组text[len],用来吸收用户从文件中读出的文件内容;②检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1,并显示出错信息;③挪用do_read()将指定文件中的len字节内容读出到text[]中;④假如do_read()的返回值为负,则显示出错信息;不然将text[]中的内容显示到屏幕上;⑤返回.15. 现实读文件函数do_read()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: int do_read (int fd, int len,char *text)(4)功效: 被my_read()挪用,读出指定文件中从读写指针开端的长度为len的内容到用户空间的text中. (5)输入:fd: open()函数的返回值,文件的描写符;len: 请求从文件中读出的字节数.text: 指向存放读出数据的用户区地址(6)输出: 现实读出的字节数.(7)函数需完成的工作:①应用malloc()申请1024B空间作为缓冲区buf,申请掉败则返回-1,并显示出错信息;②将读写指针转化为逻辑块块号及块内偏移量off,应用打开文件表表项中的首块号查找FAT表,找到该逻辑块地点的磁盘块块号;将该磁盘块块号转化为虚拟磁盘上的内存地位;③将该内存地位开端的1024B(一个磁盘块)内容读入buf中;④比较buf中从偏移量off开端的残剩字节数是否大于等于应读写的字节数len,假如是,则将从off开端的buf中的len长度的内容读入到text[]中;不然,将从off开端的buf中的残剩内容读入到text[]中;⑤将读写指针增长④中已读字节数,将应读写的字节数len减去④中已读字节数,若len大于0,则转②;不然转⑥;⑥应用free()释放①中申请的buf.⑦返回现实读出的字节数.16.退出文件体系函数my_exitsys()(1)对应敕令: my_exitsys(2)敕令挪用格局: my_ exitsys(1)函数设计格局: void my_exitsys()(2)功效: 退出文件体系.(3)输入: 无(4)输出: 无.(5)函数需完成的工作:①应用C库函数fopen()打开磁盘上的myfsys文件;②将虚拟磁盘空间中的所有内容保存到磁盘上的myfsys文件中;③应用c说话的库函数fclose()封闭myfsys文件;④撤销用户打开文件表,释放其内存空间⑤释放虚拟磁盘空间.流程图#include <string.h>#include <time.h>#define BLOCKSIZE 1024 // 磁盘块大小#define SIZE 1024000 // 虚拟磁盘空间大小#define END 65535 // FAT中的文件停止标志#define FREE 0 // FAT中盘块余暇标志#define ROOTBLOCKNUM 2 // 根目次区所占盘块数#define MAXOPENFILE 10 // 最多同时打开文件个数t#define MAXTEXT 10000/* 文件掌握块 */typedef struct FCB{char filename[8]; // 文件名char exname[3]; // 文件扩大名unsigned char attribute; // 文件属性字段,值为0时表示目次文件,值为1时表示数据文件unsigned short time; // 文件创建时光unsigned short date; // 文件创建日期unsigned short first; // 文件肇端盘块号unsigned long length; // 文件长度char free; // 表示目次项是否为空,若值为0,表示空,值为1,表示已分派}fcb;/* 文件分派表 */typedef struct FAT{unsigned short id; // 磁盘块的状况(余暇的,最后的,下一个)}fat;/* 用户打开文件表 */typedef struct USEROPEN{char filename[8]; // 文件名char exname[3]; // 文件扩大名unsigned char attribute;//文件属性字段,值为0时表示目次文件,值为1时表示数据文件unsigned short time; // 文件创建时光unsigned short date; // 文件创建日期unsigned short first; // 文件肇端盘块号unsigned long length;//文件长度(对数据文件是字节数,对目次文件可所以目次项个数)char free; // 表示目次项是否为空,若值为0,表示空,值为1,表示已分派unsigned short dirno; // 响应打开文件的目次项在父目次文件中的盘块号int diroff; // 响应打开文件的目次项在父目次文件的dirno盘块中的目次项序号char dir[80]; // 响应打开文件地点的路径名,如许便利快速检讨出指定文件是否已经打开int father; // 父目次在打开文件表项的地位int count; // 读写指针在文件中的地位,文件的总字符数char fcbstate; // 是否修正了文件的FCB的内容,假如修正了置为1,不然为0char topenfile; // 表示该用户打开表项是否为空,若值为0,表示为空,不然表示已被某打开文件占领}useropen;/* 引诱块 */typedef struct BLOCK0{char magic[10]; // 文件体系魔数char information[200];//存储一些描写信息,如磁盘块大小.磁盘块数目.最多打开文件数等 unsigned short root; // 根目次文件的肇端盘块号unsigned char *startblock; // 虚拟磁盘上数据区开端地位}block0;unsigned char *myvhard; // 指向虚拟磁盘的肇端地址useropen openfilelist[MAXOPENFILE]; // 用户打开文件表数组int curdir; // 用户打开文件表中的当前目次地点打开文件表项的地位char currentdir[80]; // 记载当前目次的目次名(包括目次的路径)unsigned char* startp; // 记载虚拟磁盘上数据区开端地位char myfilename[] = "myfilesys";//文件体系的文件名void startsys(); // 进入文件体系void my_format(); // 磁盘格局化void my_cd(char *dirname); // 更改当前目次void my_mkdir(char *dirname); // 创建子目次void my_rmdir(char *dirname); // 删除子目次void my_ls(); // 显示目次void my_create (char *filename); // 创建文件void my_rm(char *filename); // 删除文件int my_open(char *filename); // 打开文件int my_close(int fd); // 封闭文件int my_write(int fd); // 写文件int do_write(int fd, char *text, int len, char wstyle); // 现实写文件int my_read (int fd, int len); // 读文件int do_read (int fd, int len,char *text); // 现实读文件void my_exitsys(); // 退出文件体系unsigned short findblock(); // 查找余暇盘块int findopenfile(); // 查找余暇文件表项void startsys(){FILE *fp;unsigned char buf[SIZE];fcb *root;int i;myvhard = (unsigned char *)malloc(SIZE);//申请虚拟磁盘空间memset(myvhard, 0, SIZE);//将myvhard中前SIZE个字节用 0 调换并返回 myvhard if((fp = fopen(myfilename, "r")) != NULL){fread(buf, SIZE, 1, fp);//将二进制文件读取到缓冲区fclose(fp);if(strcmp(((block0 *)buf)->magic, "10101010")){printf("myfilesys is not exist,begin to creat the file...\n");my_format();}else{for(i = 0; i < SIZE; i++)myvhard[i] = buf[i];}}else{printf("myfilesys is not exist,begin to creat the file...\n");my_format();}root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(openfilelist[0].filename, root->filename);strcpy(openfilelist[0].exname, root->exname);openfilelist[0].attribute = root->attribute;openfilelist[0].time = root->time;openfilelist[0].date = root->date;openfilelist[0].first = root->first;openfilelist[0].length = root->length;openfilelist[0].free = root->free;openfilelist[0].dirno = 5;openfilelist[0].diroff = 0;strcpy(openfilelist[0].dir, "\\root\\");openfilelist[0].father = 0;openfilelist[0].count = 0;openfilelist[0].fcbstate = 0;openfilelist[0].topenfile = 1;for(i = 1; i < MAXOPENFILE; i++)openfilelist[i].topenfile = 0;curdir = 0;strcpy(currentdir, "\\root\\");startp = ((block0 *)myvhard)->startblock;}void my_format(){FILE *fp;fat *fat1, *fat2;block0 *blk0;time_t now;struct tm *nowtime;fcb *root;int i;blk0 = (block0 *)myvhard;fat1 = (fat *)(myvhard + BLOCKSIZE);fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(blk0->magic, "10101010");strcpy(blk0->information, "My FileSystem Ver 1.0 \n Blocksize=1KB Whole size=1000KB Blocknum=1000 RootBlocknum=2\n");blk0->root = 5;blk0->startblock = (unsigned char *)root;for(i = 0; i < 5; i++){fat1->id = END;fat2->id = END;fat1++;fat2++;}fat1->id = 6;fat2->id = 6;fat1++;fat2++;fat1->id = END;fat2->id = END;fat1++;fat2++;for(i = 7; i < SIZE / BLOCKSIZE; i++){fat1->id = FREE;fat2->id = FREE;fat1++;fat2++;}now = time(NULL);nowtime = localtime(&now);strcpy(root->filename, ".");strcpy(root->exname, "");root->attribute = 0x28;root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;root->length = 2 * sizeof(fcb);root->free = 1;root++;now = time(NULL);nowtime = localtime(&now);strcpy(root->filename, "..");strcpy(root->exname, "");root->attribute = 0x28;root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;root->length = 2 * sizeof(fcb);root->free = 1;fp = fopen(myfilename, "w");fwrite(myvhard, SIZE, 1, fp);fclose(fp);}void my_cd(char *dirname){char *dir;int fd;dir = strtok(dirname, "\\");//分化字符串为一组字符串.dirname为要分化的字符串,"\\"为分隔符字符串 if(strcmp(dir, ".") == 0)return;else if(strcmp(dir, "..") == 0){if(curdir)curdir = my_close(curdir);return;}else if(strcmp(dir, "root") == 0){while(curdir)curdir = my_close(curdir);dir = strtok(NULL, "\\");}while(dir)。
操作系统课程设计(文件系统管理)-标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII评定等级操作系统课程设计文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制文件系统管理一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。
通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。
二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。
在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。
以下报告主要包括:1.可行性分析2.需求分析3.概要设计4.详细设计5.测试6.总结三、可行性分析1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。
利用大二期间学习的数据结构可以模拟出此课程设计的要求。
2、经济可行性课程设计作为本课程的练习及进一步加深理解。
与经济无关,可以不考虑。
(零花费,零收益)3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。
四、需求分析编写程序实现文件系统,主要有以下几点要求:1、实现无穷级目录管理及文件管理基本操作2、实现共享“别名”3、加快了文件检索五、概要设计为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。
这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。
此外,在系统中再建立一个主文件目录MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。
操作系统文件系统课程设计
操作系统文件系统课程设计主要涉及以下几个方面:
1. 实现基于模块的文件系统:
- 修改ext3或ext4的源代码
- 动态加载和卸载新的文件系统
- 修改文件系统的名称,优化文件写操作
2. 新增Linux驱动程序:
- 增加一个驱动程序(使用内存模拟设备)
- 动态加载和卸载新的驱动
- 通过程序或命令行使用该驱动
- 保存和读取数据
3. 统计Linux系统缺页的次数:
- 在内核中实现缺页次数统计
- 编译并安装新内核
- 建立内核模块,通过/proc实现用户态查看缺页次数
4. 模拟磁盘文件系统实现:
- 设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区
- 支持多级目录结构,支持文件的绝对读路径
- 实现建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性等命令建议根据以上概述,结合实际需求和兴趣,选择相应的题目进行课程设计。
评定等级操作系统课程设计文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制文件系统管理一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。
通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。
二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。
在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。
以下报告主要包括:1.可行性分析2.需求分析3.概要设计4.详细设计5.测试6.总结三、可行性分析1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。
利用大二期间学习的数据结构可以模拟出此课程设计的要求。
2、经济可行性课程设计作为本课程的练习及进一步加深理解。
与经济无关,可以不考虑。
(零花费,零收益)3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。
四、需求分析编写程序实现文件系统,主要有以下几点要求:1、实现无穷级目录管理及文件管理基本操作2、实现共享“别名”3、加快了文件检索五、概要设计为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。
这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。
此外,在系统中再建立一个主文件目录MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。
本设计主要实现下面几个数据结构:M D F 用户名文件目录指针用户名文件目录指针U F D文件名保护码文件长度文件名···A F D打开文件名打开保护码读写指针总体的流程图如下:六、详细设计主要数据结构:1.MFD(Master File Directory),主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。
所以,MFD结构仅包括用户名和指向子目录的一个指针,以及指向下一用户的连接点,为线性结构。
struct MFD{char name[20]; //用户名UFD *bst_pointer; //文件目录指针MFD *link;};2. UFD(User File Directory),用于存放文件的数据结构。
由于本设计为了加快检索速度,使用了二叉排序树的结构,所以UFD结构中相应加入了用于树结构的parent,leftchild,和rightchild记录链接情况。
当本文件为普通文件时,为下级记录申请AFD(file),folder为空。
同样,当本文件为文件夹时,为它申请相应的空间,AFD为空。
以此来达到无穷级别目录的存储。
struct UFD{UFD *parent;UFD *leftchild;UFD *rightchild;UFD *folder; //作为文件夹时指向下一层,文件时为空UFD *pre_folder; //指向上一层目录(文件夹时用到)AFD *file; //作文文件时文件的具体内容char name[30]; //文件(夹)名字int length; //作为文件时文件的长度,默认为0char rw; //读写标志r or wchar share; //共享标志y or nchar file_folder; //指示此文件是文件或文件夹,f为文件,o为文件夹};3.AFD,存放文件的内容的结构,比较简单,文件内容用一个字符数组存储,为顺序结构,最多可存放99个字符struct AFD{char afd_file[100];int read; //读指针int write; //写指针};4.RECstruct REC //UFD的线性链,用于记录共享文件和已打开文件{UFD *file;REC *link;};关键函数说明:void Log_in();//登陆void Init_user();//创建用户void Check_user();//查看用户以上三个函数为开始时管理用户创建和登陆的函数。
开始时没有用户,需要创建后才可登陆。
创建用户即自动分配一个存放用户文件的UFD,此时的UFD为空,需要后续的创建文件以及文件夹的分配。
UFD *operations(UFD *fileBST);//文件夹的操作调用用户登陆后即开始对该用户文件UFD的操作,同时,若在文件夹中创建一个文件夹,它同样可以分配得到一个UFD,对用户文件的操作可以重复调用,以此来达到无穷级目录的操作。
在里层文件的操作和外层的是一样的,但若要退回外层文件夹就需要逐层返回,不能立即跳到某一层某地址。
操作完毕后返回改变后的文件存储状态。
void fcreate(UFD *fileBST);//对文件夹的六个基本操作UFD *fdelete(UFD *fileBST);void fopen(UFD *fileBST);void fclose(UFD *fileBST);void fread_write(UFD *fileBST,char f);//读写操作。
按选择f=5为读6为写以上五个函数为对文件的六个基本操作,其中读文件和写文件部分代码相同,所以由一个函数完成。
在create五个函数中,分别对文件夹fileBST做了相应的处理,由于删除文件的函数可能会删除到头结点,所以需要一个返回值。
void insertBST(UFD *fileBST,UFD *newBST);//在fileBST中插入新的结点newBSTUFD *searchBST(UFD *fileBST,char name);//在fileBST树中查找名字为name的结//点并返回该结点,文件不存在则返回空void BSTtraverse(UFD *fileBST);//遍历二叉树UFD *deleteBST(UFD *fileBST,char name[30]);//删除name结点,返回删除后的结点由于该设计的存储结构用到了二叉排序树,所以把相关的操作写成函数,供基本操作的函数调用。
insert函数在fileBST中插入新的结点newBST;search函数在fileBST树中查找名字为name的结点并返回该结点,文件不存在则返回空;还有traverse和delete函数对二叉排序树做了基本的操作。
void print_path(UFD *fileBST);//输出当前路径void print_open_file();//输出已打开的文件为了在文件系统中使用户看出路径及一些相关的状态,设置了输出文件路径的函数,路径由每个文件的结构体中pre_folder记录上一层的文件夹名字,这样逐层输出即可达到目的。
每执行一次操作就输出一次已打开的文件的具体情况,打开的文件应及时关闭,否则删除时会有删除失败提示。
UFD *check_share(char name[30]);//在共享链中检查是否有name文件,有则//返回该UFD,没则NULLvoid del_in_share(UFD *node);//在共享链中删除node结点以上两个函数为对共享文件的处理函数,当打开或读写文件时在本层文件中未找到相应的文件时,就用check_share函数在共享文件中查找,如果存在就返回该文件的UFD,不存在就返回NULL,而del_in_share函数是伴随着删除文件的函数出现的,目的是为了删除文件以后不会在共享链中再存在。
具体代码如下:filesysterm.hstruct AFD{char afd_file[100];int read; //读指针int write; //写指针};struct UFD{UFD *parent;UFD *leftchild;UFD *rightchild;UFD *folder; //作为文件夹时指向下一层,文件时为空UFD *pre_folder; //指向上一层目录(文件夹时用到)AFD *file; //作文文件时文件的具体内容char name[30]; //文件(夹)名字int length; //作为文件时文件的长度,默认为0char rw; //读写标志r or wchar share; //共享标志y or nchar file_folder; //指示此文件是文件或文件夹,f为文件,o为文件夹};struct MFD{char name[20]; //用户名UFD *bst_pointer; //文件目录指针MFD *link;};struct REC //UFD的线性链,用于记录共享文件和已打开文件{UFD *file;REC *link;};void Log_in(); //登陆void Init_user(); //创建用户void Check_user(); //查看用户UFD *operations(UFD *fileBST); //文件夹的操作调用,user不为空时为第一层void fcreate(UFD *fileBST); //对文件夹的六个基本操作UFD *fdelete(UFD *fileBST);void fopen(UFD *fileBST);void fclose(UFD *fileBST);void fread_write(UFD *fileBST,char f); //代码有重复,合并读写操作。
按选择s=5为读6为写void insertBST(UFD *fileBST,UFD *newBST); //新文件插入到user文件树中UFD *searchBST(UFD *fileBST,char name); //在fileBST树中查找名字为name的结点并返回该结点//文件不存在则返回空void BSTtraverse(UFD *fileBST); //遍历二叉树UFD *deleteBST(UFD *fileBST,char name[30]); //删除成功返回1,失败返回0void print_path(UFD *fileBST); //输出当前路径void print_open_file(); //输出已打开的文件UFD *check_share(char name[30]); //在共享链中检查是否有name文件,有则返回UFD,没则NULLvoid del_in_share(UFD *node); //在共享链中删除node结点main.cpp#include <iostream>#include<conio.h>#include"filesystem.h"MFD *mfd_link=NULL; //用户链表MFD *pre_user; //当前操作用户UFD *pre_opera_folder=NULL; //当前操作文件夹int folder_depth=0; //记录当前文件深度(用于辅助pre_folder的初始化)REC *share_file=NULL;REC *open_file=NULL;void print_path(UFD *fileBST) //输出路径{if(fileBST->pre_folder!=NULL){ print_path(fileBST->pre_folder);printf("/%s",fileBST->pre_folder->name);}elseprintf("/%s",pre_user->name);}void print_open_file(){REC *temp;int i=5;temp=open_file;while(temp!=NULL){printf("%s\t%d\t\t",temp->file->name,temp->file->length);if(temp->file->rw=='r')printf("只读\t");else printf("可读写\t");if(temp->file->share=='y')printf("是\t");else printf("否\t");for(i=0;i<5;i++){if(temp->file->file->afd_file[i]!='\0')printf("%c",temp->file->file->afd_file[i]);else break;}if(temp->file->file->afd_file[i]!='\0'&&i==5) printf("..");printf("\n");temp=temp->link;}}void BSTtraverse(UFD *fileBST) //遍历二叉树(前序遍历){UFD *left,*right;printf("%s",fileBST->name);if(fileBST->file_folder=='o') //输出..以区分文件夹printf("..\t");elseprintf("\t");if(fileBST->leftchild!=NULL) //递归{left=fileBST->leftchild;BSTtraverse(left);}if(fileBST->rightchild!=NULL){right=fileBST->rightchild;BSTtraverse(right);}}UFD *searchBST(UFD *fileBST,char name[30])//在fileBST树中查找名字为name的结点并返回该结点{ //文件不存在则返回空int flag;flag=strcmp(fileBST->name,name);if(flag==0)return fileBST; //查找成功else if(flag>0){if(fileBST->leftchild==NULL) return NULL; //查找失败elsesearchBST(fileBST->leftchild,name); //递归调用}else{if(fileBST->rightchild==NULL) return NULL;elsesearchBST(fileBST->rightchild,name);}}void insertBST(UFD *fileBST,UFD *newBST) //将结点newBST插入原二叉树fileBST中{int flag;flag=strcmp(fileBST->name,newBST->name);if(flag>0){if(fileBST->leftchild==NULL) //插入{fileBST->leftchild=newBST;newBST->parent=fileBST;}elseinsertBST(fileBST->leftchild,newBST); //递归调用}else{if(fileBST->rightchild==NULL) //插入{fileBST->rightchild=newBST;newBST->parent=fileBST;}elseinsertBST(fileBST->rightchild,newBST); //递归调用}/*flag=0 的情况已在创建时排除*/}UFD *deleteBST(UFD *fileBST,char name[30])//删除名字问name的文件结点{UFD *parent_file=NULL,*del_file=NULL;UFD *move_file=NULL,*move_file_parent;del_file=searchBST(fileBST,name);if(del_file==NULL){printf("没有此文件,删除失败!\n");getch();return fileBST; //查找失败}if(del_file->file_folder=='o'&&strcmp(del_file->folder->name,"NULL")!=0){ printf("注意,本系统未能实现级联删除,请先逐个删除文件!");printf("文件夹非空,删除失败!\n");getch();return fileBST;}if(del_file->share=='y') //先在共享链中删除del_in_share(del_file);parent_file=del_file->parent;if(del_file->leftchild==NULL&&del_file->rightchild==NULL) //被删除结点为子叶结点{if(del_file==fileBST) //只有一个结点{strcpy(fileBST->name,"NULL");}else if(parent_file->leftchild==del_file){parent_file->leftchild=NULL;free(del_file);}else{parent_file->rightchild=NULL;free(del_file);}}else if(del_file->leftchild==NULL||del_file->rightchild==NULL) //被删除结点没有做孩子或右孩子{if(del_file->leftchild==NULL) //没有左孩子{if(parent_file==NULL) //删除的为根结点{fileBST=del_file->rightchild;del_file->rightchild->parent=NULL;}else if(parent_file->leftchild==del_file) //右孩子接上{parent_file->leftchild=del_file->rightchild;del_file->rightchild->parent=parent_file;}else //右孩子接上{parent_file->rightchild=del_file->rightchild;del_file->rightchild->parent=parent_file;}}else //没有右孩子{if(parent_file==NULL) //删除的为根结点{fileBST=del_file->leftchild;del_file->leftchild->parent=NULL;}else if(parent_file->leftchild==del_file) //左孩子接上{parent_file->leftchild=del_file->leftchild;del_file->leftchild->parent=parent_file;}else //左孩子接上{parent_file->rightchild=del_file->leftchild;del_file->leftchild->parent=parent_file;}}free(del_file);}else //左右孩子都有{move_file_parent=del_file->leftchild;move_file=move_file_parent->rightchild;if(move_file==NULL) //被删除结点的左孩子没有右孩子{if(parent_file==NULL) //删除的为根结点{fileBST=move_file_parent;fileBST->rightchild=del_file->rightchild;fileBST->parent=NULL;}else if(parent_file->leftchild==del_file)parent_file->leftchild=move_file_parent;elseparent_file->rightchild=move_file_parent;move_file_parent->parent=parent_file;move_file_parent->rightchild=del_file->rightchild;}else{while(move_file->rightchild!=NULL) //寻找右边最底下的结点{move_file=move_file->rightchild;move_file_parent=move_file_parent->rightchild;}move_file_parent->rightchild=NULL;move_file->leftchild=del_file->leftchild;move_file->rightchild=del_file->rightchild;if(move_file->rightchild!=NULL)move_file->rightchild->parent=move_file; //右孩子的双亲也要改变move_file->parent=del_file->parent;if(fileBST==del_file) //删除的为根结点fileBST=move_file;free(del_file);}}printf("成功删除文件%s\n",name);getch();return fileBST;}void del_in_share(UFD *node){REC *first,*second;first=share_file;second=share_file->link;if(second==NULL){share_file=NULL;free(first);}elsedo{if(second->file==node){first->link=second->link;free(second);}else{first=first->link;second=second->link;}}while(second!=NULL);}void fcreate(UFD *fileBST) //在fileBST的同一层创建文件{char s;char name[30];int flag=0;UFD *newfile,*temp=NULL;REC *stemp;system("cls");printf("----------------------------------------------------------------\n");printf("------------------- 文件系统/创建文件---------------------\n");printf("----------------------------------------------------------------\n\n");do{printf(" 1. 创建文件\n");printf(" 2. 创建文件夹\n");printf(" 3. 取消\n");printf("请选择:\n");scanf("%c",&s);fflush(stdin);if(s=='3')return;if(s!='1'&&s!='2')printf("输入错误,请重新输入!\n");}while(s!='1'&&s!='2');if(strcmp(fileBST->name,"NULL")==0) //节点已有(未赋值)用于本层文件夹的第一个文件的特殊情况newfile=fileBST;else{newfile=(UFD*)malloc(sizeof(UFD)); //创建树节点newfile->leftchild=NULL;newfile->rightchild=NULL;}printf("请输入文件(夹)名:");scanf("%s",name);fflush(stdin);//搜索二叉树,文件重名就创建失败temp=searchBST(fileBST,name);if(temp!=NULL){printf("已存在该文件(夹),创建失败!\n");strcpy(newfile->name,"NULL");return;}strcpy(newfile->name,name);if(folder_depth==1)newfile->pre_folder=NULL;elsenewfile->pre_folder=pre_opera_folder;//指向正在操作文件夹while(1) //读写否,共享否{printf("只读r还是可读写w:");scanf("%c",&(newfile->rw));fflush(stdin);printf("是否共享y/n:");scanf("%c",&(newfile->share));fflush(stdin);if((newfile->rw=='r'||newfile->rw=='w')&&(newfile->share=='y'||newfile->share=='n')) break;printf("输入有误,请重新输入!\n");}//***********以下为文件和文件夹初始化中不同的地方****************** if(s=='1'){newfile->file_folder='f';newfile->folder=NULL;newfile->file=(AFD*)malloc(sizeof(AFD));printf("请输入文件的内容(<100):");scanf("%s",newfile->file->afd_file);fflush(stdin);newfile->length=strlen(newfile->file->afd_file);}else //文件夹的初始化{newfile->file_folder='o';newfile->file=NULL;newfile->length=0;newfile->folder=(UFD*)malloc(sizeof(UFD)); //连上一个空文件节点newfile->folder->pre_folder=newfile;newfile->folder->leftchild=NULL;strcpy(newfile->folder->name,"NULL");newfile->folder->rightchild=NULL;}//**************************************************************** if(fileBST!=newfile)insertBST(fileBST,newfile); //初始化完成后插入到二叉树中elsenewfile->parent=NULL;//第一个结点略去插入,其双亲结点为空if(newfile->share=='y') //接入共享链{stemp=((REC*)malloc(sizeof(REC)));stemp->file=newfile;stemp->link=share_file;share_file=stemp;}}UFD *fdelete(UFD *fileBST) //在fileBST的同一层删除文件{char name[30];REC *temp;printf("请输入要删除的文件:");scanf("%s",name);fflush(stdin);temp=open_file; //检查文件是否打开,打开则删除失败while(temp!=NULL){if(strcmp(temp->file->name,name)==0){ printf("文件打开中,请关闭后再删除!");getch();return fileBST;}else temp=temp->link;}fileBST=deleteBST(fileBST,name);return fileBST;}void fopen(UFD *fileBST){char name[30];UFD *temp=NULL,*temp1=NULL;printf("请输入要打开的文件的名字:");scanf("%s",name);fflush(stdin);temp=searchBST(fileBST,name);if(temp==NULL){printf("文件不存在!\n");temp=check_share(name);if(temp==NULL){ printf("文件不存在!\n");return;}}//*******************找到文件,以下为打开部分********************** if(temp->file_folder=='o') //打开文件夹{folder_depth++;temp1=pre_opera_folder; //保护正在操作文件pre_opera_folder=temp;temp->folder=operations(temp->folder);pre_opera_folder=temp1; //写回folder_depth--;}else //打开文件{REC *newopen;newopen=((REC*)malloc(sizeof(REC)));//接入打开链newopen->file=temp;newopen->link=open_file;open_file=newopen;printf("已成功打开问%s!\n",temp->name);getch();}}void fclose(){char name[30];REC *first=NULL,*second=NULL;printf("请输入要关闭的文件:");scanf("%s",name);fflush(stdin);first=open_file;if(first==NULL){printf("没有打开的文件\n");getch();return;}else second=first->link;if(second==NULL&&strcmp(first->file->name,name)==0){free(first); open_file=NULL;printf("成功关闭文件%s\n!",name);return;}else{while(second!=NULL){if(strcmp(second->file->name,name)==0){first->link=second->link; free(second);printf("成功关闭文件%s\n!",name);return;}else{first=first->link;second=second->link;}}}printf("没有找到问件%s,关闭失败!\n",name);}void fread_write(UFD *fileBST,char f){char s;char name[30];char newfile[100];UFD *temp=NULL;if(f=='5')printf("请输入要读取的文件的名字:");elseprintf("请输入要写入的文件的名字:");scanf("%s",name);fflush(stdin);temp=searchBST(fileBST,name);if(temp==NULL){printf("文件不存在!\n");temp=check_share(name);if(temp==NULL){ printf("文件不存在!\n");return;}}if(temp->file_folder=='o'){printf("文件夹不可读写!");return;}printf("文件的内容是:%s\n\n\n",temp->file->afd_file);getch();if(f=='5')return; //读取文件操作到此结束if(temp->rw=='r'){printf("只读文件,不可写入!\n");return;}else //追加或重写{do{system("cls");printf(" 1. 追加\n");printf(" 2. 重写\n");printf(" 3. 取消\n");printf("请选择:\n");scanf("%c",&s);fflush(stdin);if(s=='3')return;if(s!='1'&&s!='2')printf("输入错误,请重新输入!\n");}while(s!='1'&&s!='2');printf("请输入要重写或追加的内容(<100):");scanf("%s",newfile);fflush(stdin);if(s=='1') //修改strcat(temp->file->afd_file,newfile);elsestrcpy(temp->file->afd_file,newfile);temp->length=strlen(temp->file->afd_file);}}UFD *check_share(char name[30]){char s;UFD *temp=NULL;REC *stemp=NULL;printf("共享文件夹为:\n");stemp=share_file;while(stemp!=NULL){ printf("%s",stemp->file->name);if(stemp->file->file_folder=='f')printf("\t");else printf("..\t");stemp=stemp->link;}printf("\n是否尝试在共享文件夹中打开(y/n):");do{s=getchar();if(s=='n'||s=='N')return NULL;else if(s=='y'||s=='Y')break;else printf("输入错误,请重新输入:");}while(s!='y'&&s!='n'&&s!='Y'&&s!='N');stemp=share_file;while(stemp!=NULL){if(strcmp(stemp->file->name,name)==0){temp=stemp->file;break;}stemp=stemp->link;}return temp;}UFD *operations(UFD *fileBST){while(1){char s;system("cls");if(open_file!=NULL){printf("已打开文件,请及时关闭!\n");printf("文件名\t文件长度\t读写\t共享\t内容");printf("\n");print_open_file();printf("\n");}printf("当前路径:");print_path(fileBST);printf("\n");if(strcmp(fileBST->name,"NULL")==0)printf("本层文件为空!\n");else{ printf("本文件夹包含以下文件:\n");BSTtraverse(fileBST);}printf("\n");printf(" 1. 创建文件create \n");printf(" 2. 删除文件delete \n");printf(" 3. 打开文件open \n");printf(" 4. 关闭文件close \n");printf(" 5. 读文件read \n");printf(" 6. 写文件write \n");printf(" 0. 返回上一层/注销\n\n");printf("请选择: ");printf("");scanf("%c",&s);fflush(stdin);switch(s){ case '1':fcreate(fileBST);break;case '2':fileBST=fdelete(fileBST);break;case '3':fopen(fileBST);break;case '4':fclose();break;case '5':case '6':fread_write(fileBST,s);break;case '0':return fileBST;default:break;}}}void Log_in(){MFD *temp=NULL;char name[30];char flag='0';if(mfd_link==NULL){printf("目前还没有创建用户,请创建后再登陆!");getch();return;}do{printf("请输入用户名:");scanf("%s",name);fflush(stdin);if(strcmp(name,"cancel")==0)return; //取消登陆temp=mfd_link;while(temp!=NULL){if(strcmp(name,temp->name)==0){pre_user=temp;folder_depth++;pre_opera_folder=temp->bst_pointer;temp->bst_pointer=operations(temp->bst_pointer); //进入文件操作pre_opera_folder=NULL;folder_depth--;flag='1';return;}elsetemp=temp->link;}printf("用户不存在,请重新输入!输入cancel取消登陆");//防止使用者忘记登陆名printf("\n");}while(1);}void Init_user(){char name[30];MFD *newmfd,*temp=NULL,*temp1=NULL;printf("请输入用户名:");scanf("%s",name); //输入名字fflush(stdin);printf("\n");temp=mfd_link;if(temp!=NULL)do{if(strcmp(temp->name,name)==0){ printf("用户已存在,创建失败!\n");getch();return;}if(temp->link==NULL)temp1=temp;temp=temp->link;}while(temp!=NULL);newmfd=(MFD*)malloc(sizeof(MFD));strcpy(newmfd->name,name);newmfd->bst_pointer=(UFD*)malloc(sizeof(UFD)); //创建一个空的文件夹newmfd->bst_pointer->pre_folder=NULL;newmfd->bst_pointer->leftchild=NULL;strcpy(newmfd->bst_pointer->name,"NULL");newmfd->bst_pointer->rightchild=NULL;newmfd->link=NULL;if(temp1!=NULL)temp1->link=newmfd; //插到队尾else mfd_link=newmfd;printf("成功创建用户%s!",name);getch();}void Check_user(){int i=1;MFD *temp;if(mfd_link==NULL){printf("目前还没有创建用户!");getch();return;}printf("以创建的用户有:\n");temp=mfd_link;while(temp!=NULL){ printf("用户%d: %s\n",i,temp->name);temp=temp->link;i++;}printf("\n");getch();return;}int main(){char s;while(1){system("cls");printf("----------------------------------------------------------------\n");printf("-------------------------- 文件系统-------------------------\n");printf("----------------------------------------------------------------\n\n");printf(" 1. 登录\n");printf(" 2. 添加新用户\n");printf(" 3. 查看已注册用户\n");printf(" 0. 退出\n\n");printf(" 请选择: ");printf("");scanf("%c",&s);fflush(stdin);if(s!='0'&&s!='1'&&s!='2'&&s!='3'){ printf("输入错误,请重新输入:");getch();fflush(stdin);continue;}switch(s){case '1':Log_in();break;case '2':Init_user();break;case '3':Check_user();break;case '0':return 1;default:break;}}return 0;}七、测试登录操作:以下为对文件的六个基本操作:无穷级文件、文件路径的显示,以及打开一个不存在的文件的示例:打开普通文件后的情况,此时不能删除文件:本系统未能实现级联删除,操作被禁止:关闭文件后删除操作成功:逐个删除后“文件系统”文件夹也可以删除了:八、总结本次课程设计设计的知识比较广,需要较好的理解能力和编程能力。