操作系统课程设计-模拟文件系统
操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验在计算机科学中,操作系统是一种系统软件,负责管理计算机硬件和软件资源,并为用户和应用程序提供接口。
文件管理系统是操作系统的一个重要组成部分,它负责管理计算机系统中的文件和目录,以及提供对它们的访问和操作。
本次实验旨在模拟操作系统中文件管理系统的基本功能和操作。
我们将使用一个虚拟的文件系统,通过命令行界面来模拟用户与文件系统的交互。
以下是实验的具体内容和步骤:1. 创建虚拟文件系统首先,我们需要创建一个虚拟的文件系统。
文件系统由文件和目录组成,可以通过树状结构来表示。
我们可以使用一个数据结构来模拟文件系统的存储和管理。
2. 初始化文件系统在开始操作文件系统之前,我们需要初始化文件系统。
这包括创建根目录和设置当前目录为根目录。
3. 文件和目录的创建与删除文件和目录是文件系统的基本单位。
我们可以通过命令来创建和删除文件和目录。
例如,使用"mkdir"命令创建一个目录,使用"touch"命令创建一个空文件,使用"rm"命令删除文件或目录。
4. 文件和目录的访问权限文件和目录可以设置不同的访问权限,以保护文件系统的安全性。
我们可以使用"chmod"命令来修改文件或目录的权限。
权限通常包括读、写和执行权限。
5. 文件和目录的重命名和移动我们可以使用"mv"命令来重命名文件或目录,使用"cp"命令来复制文件或目录,使用"mv"命令来移动文件或目录。
6. 文件和目录的查找和显示我们可以使用"ls"命令来显示当前目录下的文件和目录,使用"cd"命令来切换当前目录,使用"pwd"命令来显示当前目录的路径。
此外,我们还可以使用"find"命令来查找文件或目录。
7. 文件和目录的读写操作文件可以被读取和写入。
操作系统课程设计通过模拟文件系统的实现
目录一、课程设计题目和目的 (1)二、课程设计要求 (1)三、程序设计思想 (1)四、文件系统的实现 (1)1.数据结构设计 (1)2.程序功能图 (2)3.实体关系图 (3)4.数据流图.................................................. 错误!未定义书签。
5.程序流程图 (3)(1) .建立文件:create(文件名,记录长度) (4)(2) .写文件:write(文件名,开始位置,字符串) (5)(3) .读文件:read(文件名,开始位置,长度) (6)(4) .显示文件所有内容 type(文件名) ....................... 错误!未定义书签。
(5) .删除文件delete(文件名) .............................. 错误!未定义书签。
(6) .重命名文件ren(文件名,新文件名) ..................... 错误!未定义书签。
(7) .查询文件属性ask(文件名) ............................. 错误!未定义书签。
(8) .关闭文件close(文件名) ............................... 错误!未定义书签。
五、程序运行结果及分析 (8)六、课程设计总结 (10)七、参考文献 (11)八、附录 (12)一、课程设计题目和目的通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
二、课程设计要求通过组长分工,我主要完成了如下几个功能的操作:1.创建文件:从命令中得到文件名,得到该文件的文件长度,建立文件。
修改目录表。
4.读文件:read [文件名] [显示开始字节] [显示的字节数] ,直接显示所需要的字节数。
操作系统课程设计-一个简单的文件系统的详细设计
计算机系课程设计实验报告课程名称操作系统课程设计实验学期 2012 至 2013 学年第 1 学期学生所在系部计算机与信息管理系年级 2010 专业班级计算机001班学生姓名学号任课教师实验成绩计算机系制一个简单的文件系统的详细设计一、实验目的(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验要求1、阅读所给文件系统源程序,并加注释(注释量达60%),2、修改、完善该系统,画出所设计的文件系统的详细流程图。
三、文件系统功能设计1. 功能设计该文件系统是一个多用户、多任务的文件系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统可以支持的操作命令如下:①bye——用户注销命令。
当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。
命令格式:bye②close——删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令执行完成后返回登陆界面。
命令格式:close③create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。
该文件的管理信息登记在用户文件信息管理模块中。
执行完该命令后回到执行命令行。
命令格式:create>file1其中:“>”符为提示符,file1为要创建的文件名。
④delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行。
命令格式:delete>file1其中:file1为要删除的文件名。
⑤list——显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
操作系统课程设计-文件系统
操作系统课程设计-文件系统一、引言文件系统是操作系统中的重要组成部分,负责对计算机中的文件进行管理和组织。
在操作系统课程设计中,文件系统的设计和实现是一个重要的任务。
本文将介绍文件系统的设计原则、功能和实现过程。
二、设计原则1. 可靠性文件系统需要确保数据的可靠性,能够有效地进行错误检测和纠正。
它应该能够处理文件的损坏、删除或丢失等情况,并能够进行数据恢复。
2. 效率文件系统需要具备高效的存取和查找功能,能够在较短的时间内完成对文件的操作。
它应该对文件进行良好的组织和管理,以提高文件的读写速度。
3. 安全性文件系统要能够保护文件的机密性和完整性,确保只有授权用户才能访问文件,并防止数据被恶意篡改或破坏。
4. 可扩展性文件系统应该能够适应不同容量和规模的存储设备,并能够随着存储需求的增长而进行扩展。
三、功能1. 存储管理文件系统需要对存储设备进行管理,包括磁盘空间的分配、回收和整理等操作,确保文件能够高效地存储和读取。
2. 目录管理文件系统需要提供目录管理功能,能够对文件进行组织和分类。
用户可以根据目录结构查找和管理文件,方便文件的查找和访问。
3. 文件操作文件系统需要支持各种文件操作,包括创建、删除、打开、关闭、读取和写入等操作。
它应该提供一组接口供用户和应用程序使用。
4. 错误处理文件系统需要对各种错误情况进行处理,包括磁盘故障、读写错误和用户操作错误等。
它应该能够识别和纠正错误,并提供相应的错误提示和恢复机制。
四、实现过程1. 文件分配文件系统需要确定如何将磁盘空间分配给文件,以实现高效的存储和检索。
常见的文件分配方式包括连续分配、链式分配和索引分配等。
2. 目录结构文件系统需要设计合适的目录结构,以方便用户查找和管理文件。
常见的目录结构包括树状目录结构、索引节点和哈希表等。
3. 文件读写文件系统需要实现高效的文件读写功能,包括将文件从磁盘读入内存和将文件从内存写入磁盘。
它应该提供缓存机制来加速读写操作。
操作系统课程设计-文件系统的模拟设计
操作系统课程设计报告题目:文件系统的模拟设计一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容(1)概述为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护(2)设计原理和系统总体功能框架图1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
3、磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5、对文件或目录的操作采用windows系统的API函数来实现。
6、设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动文件、返回根目录、退出。
功能结构图如图1.0所示:(3)详细设计及少数重要编码的说明这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。
①、显示列表函数和目录流程图如图1.1所示②、文件创建函数算法:查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
模拟实现文件系统,操作系统课程设计
某某大学课程设计报告课程名称:操作系统课程设计设计题目:模拟实现文件系统系别:计算机系专业:计算机科学与技术组别:学生姓名: 学号:起止日期:指导教师:目录目录 0第一章需求分析 (1)1.1 课程设计题目 (1)1.2 课程任务及要求 (1)1.3课程设计思想: (1)1.4软硬件运行环境及开发工具: (2)第二章概要设计 (3)2.1流程图 (3)2.2用到的原理 (3)第三章详细设计 (4)第四章调试与操作说明 (9)4.1用户登陆界面 (9)4.2创建文件界面 (9)4.3删除文件界面 (10)4.4退出界面 (10)第五章课程设计总结与体会 (10)第六章致谢 (11)第七章参考文献 (11)第一章需求分析1.1 课程设计题目课程设计题目:模拟实现文件系统1.2 课程任务及要求要求:实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能给出实现方案(包括数据结构和模块说明等)画出程序的基本结构框图和流程图分析说明每一部分程序的设计思路实现源代码按期提交完整的程序代码和可执行程序根据要求完成课程设计报告总结1.3课程设计思想:模拟实现文件系统问题是一个经典的关于文件的处理问题,包括:实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能。
设计思想如下:1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2.文件物理结构可采用显式链接或其他方法。
3.磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。
5.设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建: create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)列出文件目录:dir(10)退出:logout1.4软硬件运行环境及开发工具:a)程序设计语言:C++b)计算机及操作系统:PC机,WindowsXPc)开发平台:Microsoft Visual C++ 6.0d)运行平台:PC机,WindowsXP第二章概要设计2.1流程图模拟实现文件系统的主要流程图如下:2.2用到的原理1.本系统初始化了十个用户,每个用户初始化五个文件,最多可拥有十个文件,所以每个用户在此基础上可为自己再创建五个文件,也可以在删除文件后再创建。
操作系统课程设计--基于Linux的模拟文件系统的设计与实现
操作系统课程设计--基于Linux的模拟⽂件系统的设计与实现简单地说,Linux是⼀套免费使⽤和⾃由传播的类Unix操作系统,它主要⽤于基于Intel x86系列CPU的计算机上。
这个系统是由世界各地的成千上万的程序员设计和实现的。
其⽬的是建⽴不受任何商品化软件的版权制约的、全世界都能⾃由使⽤的Unix兼容产品。
Linux不仅为⽤户提供了强⼤的操作系统功能,⽽且还提供了丰富的应⽤软件。
⽤户不但可以从Internet上下载Linux及其源代码,⽽且还可以从Internet上下载许多Linux的应⽤程序。
可以说,Linux本⾝包含的应⽤程序以及移植到Linux上的应⽤程序包罗万象,任何⼀位⽤户都能从有关Linux的⽹站上找到适合⾃⼰特殊需要的应⽤程序及其源代码,这样,⽤户就可以根据⾃⼰的需要下载源代码,以便修改和扩充操作系统或应⽤程序的功能。
这对Windows NT、Windows98、MS-DOS或OS/2等商品化操作系统来说是⽆法做到的。
Linux具有:稳定、可靠、安全的优点,并且有强⼤的⽹络功能。
其中有对读、写进⾏权限控制、审计跟踪、核⼼授权等技术,这些都为安全提供了保障。
在相关软件的⽀持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使⽤,利⽤IPCHAINS/IPTABLE⽹络治理⼯具可构建NAT及功能全⾯的防⽕墙。
Linux是在GNU公共许可权限下免费获得的,是⼀个符合POSIX标准的操作系统。
Linux 操作系统软件包不仅包括完整的Linux 操作系统,⽽且还包括了⽂本编辑器、⾼级语⾔编译器等应⽤软件。
它还包括带有多个窗⼝管理器的X-Windows图形⽤户界⾯,如同我们使⽤Windows NT⼀样,允许我们使⽤窗⼝、图标和菜单对系统进⾏操作。
1需求分析 (2)1.1 功能介绍 (2)1.2 ⽬的及意义 (4)1.2.1 ⽬的 (4)1.2.2 意义 (5)1.3 设计成果 (6)2总体设计 (7)2.1功能介绍 (7)2.2模块关联 (8)3详细设计 (11)3.1⽤户结构 (11)3.2数据结构说明 (11)3.3主要功能的关键代码 (12)4测试及运⾏结果 (17)4.1 测试定义 (17)4.2 测试⽬的 (17)4.3 测试结果 (18)4.3.1 ⽂件测试 (18)5⼼得 (40)1需求分析1.1 功能介绍基于Linux的模拟⽂件系统的设计与实现完成以下功能:(1)创建⽤户:⼿动的创建10个⽤户,都在界⾯上完成,输⼊⽤户名;每个⽤户最多可以保存10个⽂件。
操作系统课程设计文件系统
操作系统课程设计:文件系统一、引言文件系统是操作系统中的一个重要组成部分,负责管理计算机存储设备上的文件和目录。
一个高效可靠的文件系统对于操作系统和用户来说都至关重要。
在操作系统课程中,设计一个文件系统是一项重要的任务,可以帮助学生深入了解文件系统的原理和实现细节。
本文档将介绍一个简单的文件系统设计,旨在帮助初学者理解文件系统的基本概念和工作原理。
我们将首先介绍文件系统的基本概念,然后讨论文件系统的设计思路和关键组成部分。
最后,我们将讨论如何实现和测试文件系统。
二、文件系统的基本概念文件系统是操作系统提供的一种存储管理机制,用于将文件组织成有层次的结构并提供对文件的访问和管理。
在一个文件系统中,文件被组织成目录(或文件夹)的层次结构,用户可以使用文件路径来访问文件和目录。
文件系统通常提供以下功能: - 文件和目录的创建、删除和重命名 - 文件和目录的读取和写入 - 文件和目录的权限管理 - 文件的共享和保护 - 文件的存储管理三、设计思路在设计文件系统时,需要考虑以下几个关键方面:1. 文件系统的组织结构文件系统可以采用不同的组织结构,常见的包括层次结构、网络结构和日志结构。
在设计文件系统时,需要根据具体需求选择合适的结构。
2. 文件和目录的管理文件系统需要提供对文件和目录的管理功能,包括创建、删除、重命名和移动等操作。
此外,还需要支持文件和目录的权限管理,确保只有授权用户可以进行相应操作。
3. 文件的存储管理文件系统需要负责将文件存储在磁盘或其他存储设备上,并提供高效的读写操作。
存储管理的关键是如何将文件划分为适当大小的块并将它们存储在存储设备上。
4. 文件的共享和保护文件系统需要支持文件的共享和保护。
共享可以使多个用户同时访问同一文件,保护则确保只有合法用户可以进行读写操作。
四、文件系统的关键组成部分一个典型的文件系统通常由以下几个关键组成部分构成:1. 文件控制块(FCB)文件控制块是文件系统中一个重要的数据结构,用于记录文件的相关信息,包括文件名、大小、权限和存储位置等。
操作系统课程设计报告5——模拟文件系统
操作系统课程设计报告——模拟文件系统1实现功能实现了符合要求的文件系统。
实现了要求的文件系统接口。
2文件系统的实现2.1目录项结构体dirEntry文件系统中,使用dirEntry结构体表示一个目录项。
该结构体长64字节,其中记录了该项的FAT表入口位置start,文件名name(最长50字节)和长9字节的未用项unused(可用于扩展文件系统的功能,记录其他信息)。
系统中的目录实际上就是仅由dirEntry项构成的目录文件。
2.2文件描述符分配表项结构体filpEntry使用filpEntry结构体来表示一个已经打开的文件。
它长8个字节,记录的信息包括该文件的FAT表入口位置start,以及文件指针位置position。
fdPool数组提供了100个可用的filpEntry指针;minNotUsedFd变量储存当前最小未用的文件描述符。
每当打开一个文件时,要调用get_fd函数,它为文件分配一个描述符,增加一个filpEntry项,并调整minNotUsedFd的值。
当关闭文件时,需要调用free_fd函数,来释放一个文件描述符和对应的filpEntry。
2.3文件分配表FAT文件系统中,需要记录文件存储的块号的数据结构。
除了可以使用inode以外,还可以使用FAT。
FAT在使用过程中需要将整张表读入内存,而使用inode时,只需要将使用中的inode读入内存即可;故inode占用内存较少。
但inode数据结构复杂;尤其是当文件尺寸巨大,需要使用二级甚至三级间接表时,inode在磁盘和内存之间的读写过程会变得相当繁琐。
本项目中,选择使用方便的FAT。
当磁盘空间为250MB,块大小为1KB时,将有256000块;每块的号码需要使用一个int来表达。
故FAT表需要256000项,每项4字节,共1024000字节,即1000KB。
由于超级块已经占用块0,文件分配表将占用硬盘块1~1000。
FAT的每个表项的类型都是int。
操作系统试验模拟文件管理系统
操作系统试验摹拟文件管理系统一、引言文件管理是操作系统中的重要组成部份,它负责对计算机中的文件进行组织、存储和访问。
摹拟文件管理系统是为了更好地理解文件管理的原理和实现方式而设计的一个实验项目。
本文将详细介绍摹拟文件管理系统的设计和实现。
二、设计目标1. 实现基本的文件管理功能,包括文件的创建、删除、打开和关闭。
2. 实现文件的读写操作,包括顺序读写和随机读写。
3. 实现文件的共享和保护机制,确保多个进程可以同时对同一个文件进行读写操作。
4. 实现文件的索引和目录结构,方便文件的查找和管理。
5. 实现文件的存储管理,包括空暇空间管理和磁盘分配算法。
三、系统设计1. 文件的创建和删除在摹拟文件管理系统中,可以通过命令行或者图形界面来创建和删除文件。
创建文件时,系统会为该文件分配一个惟一的文件标识符,并在文件目录中记录该文件的相关信息。
删除文件时,系统会释放该文件占用的存储空间,并从文件目录中删除该文件的记录。
2. 文件的打开和关闭在摹拟文件管理系统中,可以通过命令行或者图形界面来打开和关闭文件。
打开文件时,系统会根据文件标识符在文件目录中查找该文件的相关信息,并将该文件的描述符返回给用户进程。
关闭文件时,系统会释放该文件的描述符,并更新文件的相关信息。
3. 文件的读写操作在摹拟文件管理系统中,可以通过命令行或者图形界面来进行文件的读写操作。
顺序读写是指按照文件的存储顺序挨次读取或者写入文件的内容,而随机读写是指根据文件的索引或者偏移量来读取或者写入文件的内容。
系统会根据用户进程的读写请求,将相应的数据从磁盘中读取或者写入到内存中。
4. 文件的共享和保护机制在摹拟文件管理系统中,多个进程可以同时对同一个文件进行读写操作。
系统会通过锁机制来实现文件的共享和保护。
当一个进程正在对文件进行读写操作时,其他进程需要等待该进程释放文件的锁才干对文件进行读写操作。
同时,系统还可以设置文件的访问权限,确保惟独具有相应权限的进程才干对文件进行读写操作。
操作系统 文件系统课程设计
操作系统文件系统课程设计
操作系统文件系统课程设计主要涉及以下几个方面:
1. 实现基于模块的文件系统:
- 修改ext3或ext4的源代码
- 动态加载和卸载新的文件系统
- 修改文件系统的名称,优化文件写操作
2. 新增Linux驱动程序:
- 增加一个驱动程序(使用内存模拟设备)
- 动态加载和卸载新的驱动
- 通过程序或命令行使用该驱动
- 保存和读取数据
3. 统计Linux系统缺页的次数:
- 在内核中实现缺页次数统计
- 编译并安装新内核
- 建立内核模块,通过/proc实现用户态查看缺页次数
4. 模拟磁盘文件系统实现:
- 设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区
- 支持多级目录结构,支持文件的绝对读路径
- 实现建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性等命令建议根据以上概述,结合实际需求和兴趣,选择相应的题目进行课程设计。
操作系统课程设计模拟文件系统
操作系统课程设计模拟文件系统学院: 计算机科学技术专业: 计算机科学与技术(工)班级: 计10- 1班**: ***学号: ****************: ***2013年07月16日《操作系统原理》课程设计任务书(计算机科学与技术专业10-1)一、课程设计题目(任选一个题目)1.模拟进程管理2.模拟处理机调度3.模拟存储器管理4.模拟文件系统5.模拟磁盘调度二、设计目的和要求1.设计目的《操作系统原理》课程设计是网络工程专业实践性环节之一, 是学习完《操作系统原理》课程后进行的一次较全面的综合练习。
其目的在于加深对操作系统的理论、方法和基础知识的理解, 掌握操作系统结构、实现机理和各种典型算法, 系统地了解操作系统的设计和实现思路, 培养学生的系统设计能力, 并了解操作系统的发展动向和趋势。
2.基本要求:(1)选择课程设计题目中的一个课题, 独立完成。
(2)良好的沟通和合作能力(3)充分运用前序课所学的软件工程、程序设计、数据结构等相关知识(4)充分运用调试和排错技术(5)简单测试驱动模块和桩模块的编写(6)查阅相关资料, 自学具体课题中涉及到的新知识。
(7)课题完成后必须按要求提交课程设计报告, 格式规范, 内容详实。
三、设计内容及步骤1.根据设计题目的要求, 充分地分析和理解问题, 明确问题要求做什么。
2.根据实现的功能, 划分出合理的模块, 明确模块间的关系。
3.编程实现所设计的模块。
4.程序调试与测试。
采用自底向上, 分模块进行, 即先调试低层函数。
能够熟练掌握调试工具的各种功能, 设计测试数据确定疑点, 通过修改程序来证实它或绕过它。
调试正确后, 认真整理源程序及其注释, 形成格式和风格良好的源程序清单和结果;5.结果分析。
程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
目录1.课程设计的目的 (1)2.课程设计的要求 (1)3.需求分析 (1)3.1问题描述 (1)3.2数据结构 (2)3.2.1 类 (2)3.2.2 结构 (2)3.2.3 函数 (2)3.3系统运行环境 (3)4.概要设计 (3)4.1创建文件操作 (3)4.2删除文件操作 (4)4.3查看文件块号 (4)5 详细设计 (4)5.1创建文件 (4)5.2删除文件 (7)5.3查看文件块号 (10)6.总结 (12)参考文献 (13)附录 (15)1.课程设计的目的掌握模拟文件系统的设计方法, 具备初步的独立分析和设计能力。
模拟文件系统
操作系统课程设计-模拟文件系统班级:计044班姓名:夏鑫学号:2004121228一.实验目的用高级语言编写和调试一个简单的文件系统。
模拟文件管理的工作过程。
加深理解文件系统的内部功能和内部实现。
二.基本要求在任意一个OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟UNIX文件系统。
可以实现下列几条命令FORMAT 初始化MKF 创建文件(给出文件名,文件长度)MKD 创建目录CD 改变当前目录(CD .. 返回根目录)DELF 删除文件DELD 删除目录DIR 显示文件目录(当前目录下)HELP 获得命令的帮助EXIT 退出系统三.设计思想说明1.设计环境课程设计的环境是windows xp sp2操作系统。
在windows系统中创建一个较大容量的文件,作为所设计文件系统的假想的“文件卷”,从而编写各程序模块。
2.开发环境课程设计所使用的开发环境是VC++ 6.03.基本思想以 1M 的存储器空间为例作为文件空间,空间“分块”。
超级块,在最前面,共占3.2k个字节。
其中0.2K个字节存放目录节点的位示图,1K个字节存放文件节点的位示图,2k字节存放盘块节点的位示图。
用位状态='0'表示空闲,状态='1'表示已分配。
后半部用于存放目录接点和文件接点。
超级块不参与文件空间的动态分配。
其他块用于存贮目录接点和文件接点的信息。
该程序在系统盘内自动创建一个目录A :作为该系统的根目录。
四.需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1.改变目录:CD 〈目录名〉,工作目录转到指定的目录下。
CD .. ,返回上一级目录下2.创建文件:MKF 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:DELF 〈文件名〉,删除指定的文件。
4.显示目录:DIR [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
模拟文件系统
***课程设计报告书所属课程名称操作系统题目模拟文件系统分院**分院专业班级学号学生姓名指导教师2012 年 6 月20 日目录第1章课程设计内容及要求 (3)第2章需求分析 (4)第3章系统设计及实现 (5)第4章课程设计心得 (16)第5章参考文献 (17)第1章课程设计内容及要求课程设计题目:模拟文件系统课程设计内容及要求:通过本次实验,建立一个简单的模拟文件管理系统,理解用户界面和操作模拟管理在操作系统中的作用。
本模拟文件管理系统实现文件的创建、文件的删除、文件目录的创建、删除文件目录、改变目录显示目录等功能。
本次课设由本人独立完成.第2章需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1.改变目录:cd 〈目录名〉,工作目录转到指定的目录下。
cd .. ,返回根目录下2.创建文件:create 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:delete 〈文件名〉,删除指定的文件。
4.显示目录:ls [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
5.创建目录:mkdir 〈目录名〉,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录。
6.删除目录:rmdir〈目录名〉,删除指定的目录。
7. 获得命令帮助HELP8. 退出文件系统EXIT要考虑的特殊情况:1.各个命令对全路径和相对路径的支持A.目录不存在时,给出错误信息B.不能用cd 进入文件C.相对路径的解析D.路径中的空格剔除2.删除目录或文件时的问题A.删除不存在的文件或目录,给出错误提示B.删除目录时目录不为空; 如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除C.进入到某个目录下,却要删除本目录或者上级目录第3章系统设计及实现模拟文件系统处理流程如下:文件系统的几个主要数据结构:<1>索引节点的数据结构:struct inode{struct inode *i_forw;struct inode *i_back;char I_falg;unsigned int I_ino;unsigned int I_count;unsigned int di_addr[NADDR];unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned short di_size;};<2>超级块的数据结构:struct filsys{unsigned short s_isize;unsigned long s_fsize;unsigned int s_nfree;unsigned short s_pfree;unsigned int s_free[NICPREE];unsigned int s_ninode;unsigned short s_pinode;unsigned int s_inode[NICINOD];unsigned int s_rinode;char s_fmod;};<3>有关目录的数据结构:struct dinode{unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned short di_size;unsigned int di_addr[NADDR]; };struct direct{char d_name[DIRSIZ];unsigned int d_ino;};struct dir{struct direct ditect[DIRNUM];int size;};主要模块说明<1>创建文件int get_file(int parent,char *file_name)//创建文件节点,成功则返回文件的索引号,失败返回-1{int index;if(search(parent,file_name,1,index)! =-1) //搜索在父目录下是否有同名文件存在,有则创建失败{printf("File name repeated!\n");return -1;}for(int i=0;i<FILE_NUM;i++) //搜索空闲的文件节点if(file_flag[i]==0){strcpy(file[i].file_name,file_nam e);file[i].block_count=0;if(get_block(i)==-1) //给新创建的文件申请磁盘块,如果失败,创建文件将失败{printf("Disk volumn error!\n");return -1;}file_flag[i]=1;fileflag_flag[i]++;//登记并给文件节点初始化file_change_flag[i]++;file[i].file_length=0;file[i].parent=parent;GetLocalTime(&file[i].ctime); //获得当前时间return i;}return -1;}int create_file(int parent,char *file_name) //在指定的目录下创建文件,如果创建成功则返回{//文件的索引号,否则返回-1if(dir[parent].file_count==16) //如果父目录已满,则创建失败{printf("Parent directory is full!\n");return -1;}intpos=get_file(parent,file_name);//开始创建文件if(pos==-1){printf("Create file error!\n");return -1;}dir_node *p=&dir[parent]; //修改父目录的控制信息int top=p->file_count;p->child_file[top]=pos;p->file_count++;dir_change_flag[parent]++;return pos;}int create(char *name) //创建文件的主调函数,前提是已经取得要创建文件的索引{//成功返回文件的索引号,否则返回-1int parent,p=0;parent=get_parent(name,p);if(parent==-1)//找不到父目录,输入错误,创建失败{printf("Path name error!\n");return -1;}returncreate_file(parent,name+p);//开始创建文件}<2>创建目录int create_dir(int parent,char *dir_name) //在指定的目录下创建目录,如果成功则返回目录{//的索引号,否则返回-1if(dir[parent].dir_count==8)//如果父目录已满,则创建失败{printf("Parent directory is full!\n");return -1;}intpos=get_dir(parent,dir_name);//开始创建目录if(pos==-1){printf("Create directory error!\n");return -1;}dir_node *p=&dir[parent]; //修改父目录的控制信息int top=p->dir_count;p->child_dir[top]=pos;p->dir_count++;dir_change_flag[parent]++;return pos;}int md(char *name) //创建目录的主调函数,它的参数只有用户输入{//如果创建成功,则返回目录的索引号,否则int parent,p=0; //返回-1parent=get_parent(name,p);if(parent==-1)//父目录找不到,输入有误,创建失败{printf("Path name error!\n");return -1;}returncreate_dir(parent,name+p);//开始创建目录}<3>删除文件void del_file(int pos) //删除文件,调用该函数的前提是已经取得要删除文件的索引号{return_block(pos);//释放磁盘块file_flag[pos]=0;fileflag_flag[pos]++;file_change_flag[pos]=0;}int del_file(int parent,char *file_name) //在指定的目录下删除文件,删除成功则返回文件的{//索引号,否则返回-1int del_pos,index;if((del_pos=search(parent,file_name, 1,index))==-1)//搜索该文件是否存在,不存在则删除失败{printf("The file to delete not exist!\n");return -1;}del_file(del_pos);//开始删除文件dir_node *p=&dir[parent]; //修改父目录的控制信息if(p->file_count>=2){int top=p->file_count-1;p->child_file[index]=p->child_f ile[top];}p->file_count--;dir_change_flag[parent]++;return del_pos;}int delfile(char *name) //删除文件的主调函数,前提是知道了删除文件的名字{int parent,p=0;parent=get_parent(name,p);if(parent==-1){printf("Path name error!\n");return -1;}return del_file(parent,name+p); }<4>删除目录void del_dir(int pos) //删除指定的目录节点,该目录已经为空{dir_flag[pos]=0;dirflag_flag[pos]++;dir_change_flag[pos]=0;}void del(int pos)//删除一个指定目录及它下面的所有文件及所有目录{for(inti=0;i<dir[pos].file_count;i++)//删除当前目录下的所有文件del_file(dir[pos].child_file[i]);for(i=0;i<dir[pos].dir_count;i++) //删除子目录del(dir[pos].child_dir[i]);del_dir(pos);//删除当前目录}void del_dir(int parent,int del_pos,int index) //在一个指定的目录下删除一个目录及它下面的{//所有文件及所有目录del(del_pos);//开始删除目录if(dir[parent].dir_count>=2)//修改父目录的控制信息{inttop=dir[parent].dir_count-1;dir[parent].child_dir[index]=dir[ parent].child_dir[top];}dir[parent].dir_count--;dir_change_flag[parent]++;}<5>保存文件void savefile(int file_id) //显式保存文件的核心函数{if(fileflag_flag[file_id]%2!=0) //如果创建或删除,需要写回磁盘{write_bit(file_id,1);fileflag_flag[file_id]=0;}if(file_change_flag[file_id]>0) //如果控制信息被修改,需要写回磁盘{ write_inode(file_id,1);file_change_flag[file_id]=0;for(inti=0;i<file[file_id].block_count;i++){inttemp=file[file_id].block[i];if(blockflag_flag[temp]%2!=0) //如果磁盘块被释放或被占用,需要写回磁盘{write_bit(temp,2);blockflag_flag[temp]=0;}}}<6>保存目录void save_dir(int dir_id) //保存空目录函数{if(dirflag_flag[dir_id]%2!=0)//如果删除或创建,需要写回磁盘{write_bit(dir_id,0);dirflag_flag[dir_id]=0;}if(dir_change_flag[dir_id]>0)//如果控制信息被修改,需要写回磁盘{write_inode(dir_id,0);dir_change_flag[dir_id]=0;}}void save(int dir_id) //保存一个目录及它下面的所有目录及文件{//用了递归for(inti=0;i<dir[dir_id].dir_count;i++)save(dir[dir_id].child_dir[i]);for(i=0;i<dir[dir_id].file_count;i ++)savefile(dir[dir_id].child_file[i]) ;save_dir(dir_id);}<7>改变目录void paste(int dir_id) //用于设置当前路径{if(dir_id==0)return;paste(dir[dir_id].parent);strcat(curr_path,dir[dir_id].dir_n ame);strcat(curr_path,"/");}int change_dir(char *name) //改变工作目录,成功则返回该目{//录的索引号,否则返回-1int parent,p=0,pos,index;if(strcmp(name,"/")==0)pos=0;else if(strcmp(name,"..")==0)pos=curr_dir->parent;else{parent=get_parent(name,p);if(parent==-1){ printf("Path name error!\n");return -1;}pos=search(parent,name+p,0,ind ex);}if(pos==-1)//如果该目录不存在,则失败{printf("The dictory not exist!\n");return -1;}curr_path[3]='\0';paste(pos);curr=pos;//改变当前目录及路径curr_dir=&dir[curr];return curr;}<8>显示当前目录下的文件和子目录信息void show_dir(int dir_id) //以下几个函数用于显示当前目录下面的目录和文件,{//跟上面不同的是,它不能显示目录及文件之间的关系,printf("%s",dir[dir_id].dir_name ); //但它可以显示一些细节,如创建时间,文件for(inti=strlen(dir[dir_id].dir_name);i<20;i ++)printf(" ");printf("<DIR>");for(i=25;i<30;i++)printf(" ");printf("%d-%.2d-%.2d%.2d:%.2d:% .2d\n",dir[dir_id].ctime.wY ear,dir[di r_id].ctime.wMonth,dir[dir_id].ctim e.wDay,dir[dir_id].ctime.wHour,dir[ dir_id].ctime.wMinute,dir[dir_id].cti me.wSecond);}void show_file(int file_id) //显示一个文件{printf("%s",file[file_id].file_name); for(inti=strlen(file[file_id].file_name);i<20 ;i++)printf(" ");printf("<FILE>");for(i=26;i<30;i++)printf(" ");printf("%d-%.2d-%.2d%.2d:%.2d:%.2d",file[file_id].ctime.wYear,file[fil e_id].ctime.wMonth,file[file_id].cti me.wDay,file[file_id].ctime.wHour,f ile[file_id].ctime.wMinute,file[file_i d].ctime.wSecond);for(i=0;i<8;i++)printf(" ");int length=file[file_id].file_length; printf("len: %d bytes\n",length);}void show(int dir_id) //显示目录及文件的核心函数,用了递归思想{for(inti=0;i<dir[dir_id].file_count;i++) show_file(dir[dir_id].child_file[i]); for(i=0;i<dir[dir_id].dir_count;i++) show_dir(dir[dir_id].child_dir[i]);}void list() //显示文件及目录的主调函数{show(curr);//该函数的参数表示根目录的索引printf("\n%dfiles.\n",curr_dir->file_count); //统计文件数printf("\n%ddirs.\n",curr_dir->dir_count); //统计目录数}<9>获得系统的命令的帮助void help() //打印命令及解释{printf("Commands:Explanation:\n\n"); printf(" exit -Exit!\n"); printf(" dir -Show files and directories!\n"); printf(" mkf -Create a new file!\n"); printf(" mkd -Create a new directory!\n"); printf(" delf -Delete a file!\n"); printf(" deld -Delete a directory!\n"); printf(" cd -Change the current directory!\n"); printf(" help -Print commands!\n"); }系统实现相关截图:第4章课程设计心得课程设计能反映出一个人的编程的综合能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录第1章需求分析 (1)第2章概要设计 (1)系统的主要功能 (1)系统模块功能结构 (1)运行环境要求 (2)数据结构设计 (2)第3章详细设计 (3)模块设计 (3)算法流程图 (3)第4章系统源代码 (4)第5章系统测试及调试 (4)运行结果及分析 (4)系统测试结论 (5)第6章总结与体会 (6)第7章参考文献 (6)附录 (7)第1章需求分析通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。
模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
第2章概要设计系统的主要功能1) 系统运行时根据输入的用户数目创建主目录2) 能够实现下列命令:Login 用户登录Create 建立文件Read 读取文件Write 写入文件Delete 删除文件Mkdir 建立目录Cd 切换目录Logout 退出登录系统模块功能结构运行环境要求操作系统windows xp ,开发工具vc++数据结构设计用户结构:账号与密码结构typedef struct users{char name[8];char pwd[10];}users;本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。
users usrarray[8] ={"usr1","usr1","usr2","usr2","usr3","usr3","usr4","usr4","usr5","usr5","usr6","usr6","usr7","usr7","usr8","usr8",};(3)数据结构说明a)文件结构链表struct fnode{char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};b)函数介绍 fnode *initfile(char filename[],int isdir);模拟二级文件系统 主界面 用户登建立文删除文写入文读取文切换目建立目退出登del"<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors" <<i<<" files"<< j <<endl;return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<"<DIR>\ "<<temp->filename<<endl;i++;}else{cout<<"<FILE> "<<temp->filename<<endl;j++;} temp=temp->next;}cout<<"Total: "<<" directors" <<i<<"files"<< j <<endl; }int read(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0){cout<<recent->child->content<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0) {cout<<temp->next->content<<endl;return 1;}}cout<<"文件不存在!"<<endl;}}int write(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {recent->child->isopen=1;")==0){int i;while(recent->prev)recent=recent->prev;if(recent->parent){recent=recent->parent;}i=strlen(para);while(para[i]!='/' && i>0) i--; if(i!=0)para[i]='\0';elsepara[i+1]='\0';}else{findpara(topara);}return 1;}int findpara(char *topara) {int i=0;int sign=1;if(strcmp(topara,"/")==0){recent=root;strcpy(para,"/");return 1;}temp=recent;strcpy(temppara,para);if(topara[0]=='/'){recent=root->child;i++;strcpy(para,"/");}else{if(recent!=NULL && recent!=root) strcat(para,"/");if(recent && recent->child){if(recent->isdir)recent=recent->child;else{printf("路径错误!\n");return 1;}}}while(i<=strlen(topara) && recent) {int j=0;if(topara[i]=='/' && recent->child) {i++;if(recent->isdir)recent=recent->child;else{printf("路径错误\n");return 0;}strcat(para,"/");}while(topara[i]!='/' && i<=strlen(topara)){recentpara[j]=topara[i];i++;j++;}recentpara[j]='\0';while((strcmp(recent->filename,recentpara)!=0 || (recent->isdir!=1)) && recent->next!=NULL){recent=recent->next;}if(strcmp(recent->filename,recentpara)==0){if(recent->isdir==0){strcpy(para,temppara);recent=temp;printf("是文件不是目录。
\n");return 0;}strcat(para,recent->filename);}if(strcmp(recent->filename,recentpara)!=0 || recent==NULL){strcpy(para,temppara);recent=temp;printf("输入路径错误\n");return 0;}}return 1;}int del(){char filename[FILENAME_LENGTH];cin>>filename;temp=new fnode;if(recent->child){temp=recent->child;while(temp->next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=0)) temp=temp->next;if(strcmp(temp->filename,filename)!=0){cout<<"不存在该文件!"<<endl;return 0;}}else{cout<<"不存在该文件!"<<endl;return 0;}if(temp->parent==NULL){temp->prev->next=temp->next;if(temp->next)temp->next->prev=temp->prev;temp->prev=temp->next=NULL;}else{if(temp->next)temp->next->parent=temp->parent;temp->parent->child=temp->next;}delete temp;cout<<"文件已删除!"<<endl;}bool chklogin(char *users, char *pwd){int i;for(i=0; i<8; i++){if( (strcmp(users,usrarray[i].name)==0) && (strcmp(pwd,usrarray[i].pwd)==0)) return true;}return false;}void help(void){cout<<" 命令一览"<<endl; cout<<endl;cout<<"create: 建立文件。