模拟文件管理系统
几种文件系统的原理与对比
几种文件系统的原理与对比文件系统是计算机存储管理的一种重要方式,它负责组织和管理计算机文件的存储、命名、访问和保护等操作。
不同的文件系统采用了不同的策略和原理来管理文件的组织和存储,下面将对几种常见的文件系统原理与对比进行详细介绍。
1. FAT文件系统(File Allocation Table)FAT文件系统是最早使用的文件系统之一,它采用了FAT表的概念来管理磁盘上的文件。
在FAT表中,每个文件都分配了一个表项来记录其存储位置信息。
FAT文件系统的优点是简单易用,对于小型存储介质和嵌入式设备较为合适;缺点是文件系统效率低下,不适用于大容量存储设备。
2. NTFS文件系统(New Technology File System)NTFS文件系统是微软开发的,用于Windows操作系统的文件系统,它采用了B+树的索引方式来管理文件。
NTFS的优点在于支持大容量存储设备,具有更高的效率和更好的稳定性,同时支持文件加密、压缩和访问控制等高级功能。
3. EXT文件系统(Extended File System)EXT文件系统是Unix和Linux操作系统常用的文件系统,目前已经发展到EXT4版本。
EXT文件系统使用了索引节点(Inode)的概念来管理文件,每个文件都有一个索引节点,记录了文件的属性和数据块的地址信息。
EXT4文件系统在性能、兼容性和可靠性方面有了很大的改进,支持更大的文件和更高的性能。
4. HFS+文件系统(Hierarchical File System Plus)HFS+文件系统是苹果公司开发的文件系统,用于Macintosh电脑的操作系统。
HFS+文件系统支持大文件和Unicode编码,并且具有日志功能来提高文件系统的可靠性。
HFS+文件系统是一种面向大容量存储的文件系统,适用于苹果设备的特定要求。
在对比几种文件系统时,可以从以下几个方面进行比较:1.空间管理:文件系统应能有效地管理存储设备的空间,提供高效的存储分配和回收策略。
文件系统管理实训报告
一、实训背景随着信息技术的飞速发展,文件系统作为存储和管理数据的核心,其性能、稳定性和安全性越来越受到重视。
为了提高我们对文件系统管理的理解和实践能力,我们进行了文件系统管理实训。
本次实训以Linux系统下的文件系统管理为主要内容,通过实际操作,加深对文件系统结构、命令、权限管理等方面的认识。
二、实训目标1. 掌握Linux文件系统的基本结构;2. 熟悉常用的文件系统管理命令;3. 理解文件权限和属性的概念;4. 学会文件系统备份与恢复;5. 提高文件系统的安全性和性能。
三、实训内容(一)文件系统结构Linux文件系统采用树状结构,以根目录“/”为起点,所有文件和目录都从根目录开始分层排列。
常见的文件系统结构包括:1. 根目录(/):包含系统中的所有目录和文件;2. 换行目录(/bin、/sbin、/usr):存放常用的系统命令和系统服务;3. 用户目录(/home):存放用户个人文件和目录;4. 临时目录(/tmp):存放临时文件和程序;5. 系统目录(/etc、/var、/opt):存放系统配置文件、日志文件和可选软件包。
(二)文件系统管理命令1. ls:列出目录内容;2. pwd:显示当前目录的绝对路径;3. cd:切换目录;4. mkdir:创建目录;5. rmdir:删除空目录;6. touch:创建空文件;7. rm:删除文件或目录;8. cp:复制文件或目录;9. mv:移动或重命名文件或目录;10. chmod:修改文件权限;11. chown:更改文件所有者;12. chgrp:更改文件所属组。
(三)文件权限和属性Linux文件权限分为三组:所有者、所属组和其他用户。
每组权限包括读(r)、写(w)和执行(x)三种。
通过chmod命令可以修改文件权限,例如:- chmod 755 filename:设置所有者有读、写、执行权限,所属组和其他用户有读、执行权限;- chmod u+x filename:给所有者添加执行权限;- chmod g-w filename:取消所属组的写权限。
操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验在计算机科学中,操作系统是一种系统软件,负责管理计算机硬件和软件资源,并为用户和应用程序提供接口。
文件管理系统是操作系统的一个重要组成部分,它负责管理计算机系统中的文件和目录,以及提供对它们的访问和操作。
本次实验旨在模拟操作系统中文件管理系统的基本功能和操作。
我们将使用一个虚拟的文件系统,通过命令行界面来模拟用户与文件系统的交互。
以下是实验的具体内容和步骤:1. 创建虚拟文件系统首先,我们需要创建一个虚拟的文件系统。
文件系统由文件和目录组成,可以通过树状结构来表示。
我们可以使用一个数据结构来模拟文件系统的存储和管理。
2. 初始化文件系统在开始操作文件系统之前,我们需要初始化文件系统。
这包括创建根目录和设置当前目录为根目录。
3. 文件和目录的创建与删除文件和目录是文件系统的基本单位。
我们可以通过命令来创建和删除文件和目录。
例如,使用"mkdir"命令创建一个目录,使用"touch"命令创建一个空文件,使用"rm"命令删除文件或目录。
4. 文件和目录的访问权限文件和目录可以设置不同的访问权限,以保护文件系统的安全性。
我们可以使用"chmod"命令来修改文件或目录的权限。
权限通常包括读、写和执行权限。
5. 文件和目录的重命名和移动我们可以使用"mv"命令来重命名文件或目录,使用"cp"命令来复制文件或目录,使用"mv"命令来移动文件或目录。
6. 文件和目录的查找和显示我们可以使用"ls"命令来显示当前目录下的文件和目录,使用"cd"命令来切换当前目录,使用"pwd"命令来显示当前目录的路径。
此外,我们还可以使用"find"命令来查找文件或目录。
7. 文件和目录的读写操作文件可以被读取和写入。
操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验操作系统文件管理系统模拟实验一、实验目的本实验旨在通过模拟操作系统的文件管理系统,加深对操作系统文件管理的理解,锻炼操作系统的应用能力。
二、实验环境1、操作系统:Windows/Linux/MacOS2、编程语言:C/C++/Java/Python等三、实验内容1、初始化文件管理系统1.1 创建根目录,并初始化空文件目录1.2 初始化用户目录和权限设置2、文件操作2.1 创建文件2.1.1 检查文件名合法性2.1.2 检查文件是否已存在2.1.3 为新文件分配磁盘空间2.1.4 添加文件元数据信息2.2 打开文件2.2.1 检查文件是否存在2.2.2 检查用户权限2.3 读取文件内容2.3.1 读取文件权限检查2.3.2 读取文件内容2.4 写入文件内容2.4.1 写入文件权限检查2.4.2 写入文件内容2.5 删除文件2.5.1 检查文件是否存在2.5.2 检查用户权限2.5.3 释放文件占用的磁盘空间2.5.4 删除文件元数据信息3、目录操作3.1 创建子目录3.1.1 检查目录名合法性3.1.2 检查目录是否已存在3.1.3 添加目录元数据信息3.2 打开目录3.2.1 检查目录是否存在3.2.2 检查用户权限3.3 列出目录内容3.3.1 列出目录权限检查3.3.2 列出目录内容3.4 删除目录3.4.1 检查目录是否存在3.4.2 检查用户权限3.4.3 递归删除目录下所有文件和子目录3.4.4 删除目录元数据信息四、实验步骤1、根据实验环境的要求配置操作系统和编程语言环境。
2、初始化文件管理系统,创建根目录,并初始化用户目录和权限设置。
3、进行文件操作和目录操作。
五、实验结果分析根据实验步骤进行文件操作和目录操作,观察系统的运行情况并记录相关实验结果。
六、实验结论通过本实验,深入了解了操作系统中文件管理系统的相关原理和实现方式,并且通过实验操作进一步巩固了相应的应用能力。
操作系统模拟文件管理大作业
课程设计二:模拟文件管理一.设计目的(1)建立一个简单的模拟文件管理系统。
(2)理解用户界面和操作命令在操作系统中的作用。
二.设计要求需要实现一个命令行操作界面,包含如下命令:1. 创建文件功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必须能输入文件长度。
2. 删除文件功能:删除指定的文件3. 创建目录功能:在当前路径下创建指定的目录。
4. 删除目录功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否作删除,删除操作将该目录下的全部文件和子目录都删除。
5. 改变目录功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录下的功能,不要求实现相对目录以及绝对目录。
6. 显示目录功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。
对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误情况,程序应该作出相应处理并给出错误信息。
界面的提示符为#,提示的命令以及调试的方法应和前面的要求一致,可以自己设计更多的命令或者附加功能。
三.环境本实验是在windows xp+vc 6.0 环境下实现的,利用windows SDK 提供的系统接口(API )完成程序功能。
在windows xp 下安装好VC 后进行,VC 是一个集成开发环境,其中包含了windows SDK所有工具,所以就不用单独在安装SDK 了,程序中所用的API是操作系统提供的用来进行应用程序设计的系统功能接口。
要使用这些API,需要包含对这些函数进行说明的SDK 头文件,最常见的就是windows.h 。
一些特殊的API 调用还需要包含其他的头文件。
四.步骤1.打开 VC ,选择菜单项 File->New ,选择 Project 选项卡并建立一个名为 filesys 的 win32 console application 工程。
2. 在工程中创建原文件 filesys.cpp :选择菜单项 Project->Add to Project->File ,此时将打开一个新窗口,在其中输入想要创建的文件名字,这里是 filesys.cpp ,在其中编辑好原文 件并保存。
简单文件系统模拟实验
简单文件系统模拟实验实验目的通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统功能和实现过程的理解。
实验内容▪在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。
在退出这个简单文件系统时,应将该虚拟文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘上。
▪文件存储空间的分配可以采用显式链接分配或其它方法。
▪空闲空间的管理可以选择位示图或其它方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,可以将位示图合并到FAT中。
▪文件目录结构采用多级目录结构。
为简单起见,可以不使用索引结点,其中的每个目录项包含文件名、物理地址、文件长度等信息,还可以通过目录项实现对文件读和写的保护。
▪要求提供以下有关的文件操作:✧Format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。
✧Mkdir:用于创建子目录。
✧Rmdir:用于删除子目录。
✧Ls:用于显示目录。
✧Cd:用于更改当前目录。
✧Create:用于创建文件。
✧Open:用于打开文件。
✧Close:用于关闭文件。
✧Write:用于写文件。
✧Read:用于读文件。
✧Rm:用于删除文件。
数据结构设计磁盘:整个磁盘为一个char数组,数组中的每一个元素当做是一个扇区,每个扇区可以存储1个字节的信息,簇大小为8字节。
FAT表:存储的是指定编号的簇的下一个簇的编号是什么,因为文件是有可能分散在很多的簇里。
文件和文件夹链表:设计为静态链表,每个文件夹都会有一个子目录列表,存在链表中。
文件和目录表:文件和目录相同对待,信息存放在文件目录表中,为一个数组类型。
以上所有的信息存放在一个fs结构体中,所有的结构都为静态实现,所以需要将文件系统存放到磁盘中的时候只需要将整个结构体以二进制性质存放到文件中或者是将从文件中以二进制形式读取。
文书档案管理系统模板
文书档案管理系统XX 文书档案管理系统说文档XXXXXXX 有限公司4月1.系统介绍..................................... 错误! 未定义书签1.1 系统特点 ................................. 错误!未定义书签1.2 系统定位 ................................. 错误!未定义书签1.3 系统优势 ................................. 错误!未定义书签2.体系结构设计................................. 错误! 未定义书签2.1 系统架构 ................................. 错误!未定义书签2.2 部署结构 ................................. 错误!未定义书签2.3 层次结构 ................................. 错误!未定义书签3.系统功能..................................... 错误! 未定义书签3.1 功能结构 ................................. 错误!未定义书签3.1.1 用户管理............................ 错误!未定义书签3.1.2 文档管理............................. 错误!未定义书签3.1.3 查询借阅管理........................ 错误!未定义书签3.1.4 统计分析............................. 错误!未定义书签3.1.5 基础数据维护........................ 错误!未定义书签3.1.6 系统管理............................ 错误!未定义书签3.2 业务流程 ................................. 错误!未定义书签3.2.1 文书档案管理流程.................... 错误!未定义书签3.2.1.1 文书来源为接收纸质版或者接收电子版后打印成纸质版 ....................................................................... 错误!未定义书签3.2.1.1 文书来源为纯电子版................ 错误!未定义书签3.2.2 文书档案分发流程.................... 错误!未定义书签3.2.2.1 归档前分发......................... 错误!未定义书签3.2.2.2 归档后分发......................... 错误!未定义书签3.3 功能说明................................. 错误!未定义书签3.3.1用户管理............................ 错误!未定义书签3.3.2 文件与档案管理...................... 错误!未定义书签3.3.3 查询借阅管理........................ 错误!未定义书签3.3.4 统计分析 ............................ 错误! 未定义书签3.3.4系统管理............................ 错误!未定义书签3.3.4 基础数据维护........................ 错误!未定义书签4.系统接口.................................... 错误! 未定义书签5.表结构...................................... 错误! 未定义书签5.1 数据结构................................. 错误!未定义书签5.1.1数据来源............................ 错误!未定义书签5.1.2业务数据............................ 错误!未定义书签5.1.3管理数据............................ 错误!未定义书签5.2 报表格式................................. 错误!未定义书签5.3 文书编目................................. 错误!未定义书签5.3.1 电子文书编目........................ 错误!未定义书签5.3.2 纸质文书编目........................ 错误!未定义书签5.4 分类表................................... 错误!未定义书签5.5 工作流实现............................... 错误!未定义书签5.6 安全存储与共享的实现..................... 错误!未定义书签6.性能与并发性................................. 错误! 未定义书签6.1设计目标.............................. 错误!未定义书签6.2 应用层性能优化 ....................... 错误!未定义书签6.3 数据库层性能优化 ..................... 错误!未定义书签7.系统环境..................................... 错误! 未定义书签7.1软件环境.............................. 错误!未定义书签7.2硬件环境.............................. 错误!未定义书签1. 系统介绍系统提供了一个易用、安全、高效的档案一体化管理平台经过严谨、灵活的权限管理机制和档案共享机制, 使用户单位能够安全、可靠、高效和便捷地对档案进行存储、共享、分发应用、浏览和授控调阅等。
操作系统课程设计项目参考
滴加碘液后
滴加碘液前
12/12/2021
第十二页,共二十三页。
消化(xiāohuà):在消化道内将食物分解成可吸收 (xīshōu)的成分的过程
(包括物理性消化和化学性消化)
吸收(xīshōu):营养物质通过消化道壁进入循环 系统的过程
12/12/2021
第十三页,共二十三页。
消化(xiāohuà)和吸收的过程
12/12/2021
第十九页,共二十三页。
练习(liànxí)
• 2、分析数据,指出(zhǐ chū)哪一部分消化道中消化液最多。
• 在每天摄入800克食物和1200毫升水的情况下, 消化腺大致分泌以下数量消化液。 1500毫升唾液 2000毫升胃液 1500毫升肠液 500毫升胆汁 1500毫升胰液
12/12/2021
第二十二页,共二十三页。
内容 总结 (nèiróng)
第二节。食物中的营养物质是在消化系统中被消化和吸收的。这粒西瓜籽在姗姗的消化道内, 经过了难忘的时光。它先遇到像轧钢机似的上、下尖硬的怪物,差点儿将它压得粉身碎骨。后来它
No 钻进了一条(yī tiáo)又长又窄的迷宫,它在这里走了很久,身边的许多物质都神秘地消失了。走出迷
唾液腺、胃腺(wèixiàn)、肝脏、胰腺、肠腺
1、淀粉在__口__腔__开始消化、蛋白质在____开始胃消化、脂肪在_______开始 消小化肠。
2、胆汁是一种消化液,但不含消化酶,起乳化脂肪的作用。
二、人体消化、吸收的主要器官—— _____小肠 能 训 练解
胰脏:分泌(fēnmì)胰液 肠腺:分泌肠液
肝脏:最大的腺体,分泌胆汁。 胆汁无消化酶,有乳化脂肪 的
作用。
第七页,共二十三页。
操作系统文件管理实验报告
操作系统文件管理实验报告操作系统文件管理实验报告1:引言本实验报告旨在详细描述操作系统文件管理实验的设计、实施和结果。
文件管理是操作系统的重要组成部分,负责对计算机中的文件进行组织、存储和访问。
本实验通过模拟文件管理的过程,加深对文件管理的理解和实践。
2:实验目的本实验的主要目的是:- 理解文件系统的概念和原理- 掌握文件的创建、读取、写入和删除等基本操作- 实施并测试文件的分配和回收算法- 评估不同的文件分配算法对系统性能的影响3:实验环境本实验的实施环境如下:- 操作系统:Windows 10- 开发环境:C++ 编程语言4:实验内容4.1 文件系统设计在文件系统设计中,首先确定文件的基本单位,例如块或扇区。
然后,定义文件控制块(FCB)结构,用于存储文件的元数据信息,如文件名、大小、创建时间、权限等。
接下来,设计文件分配表,记录系统中每个块的使用情况,用于实现文件的分配和回收。
4.2 文件的创建和删除在文件的创建过程中,首先为文件分配空间,并更新文件分配表。
然后,创建文件的FCB,并将其到目录项中。
在文件的删除过程中,首先释放文件的空间,并更新文件分配表。
然后,删除文件的FCB,并从目录项中移除。
4.3 文件的读写操作文件的读写操作是用户对文件进行读取和修改的过程。
在文件读取操作中,首先找到要读取的文件的FCB,获取文件的起始块地址,并从起始块中读取数据。
在文件写入操作中,首先找到要写入的文件的FCB,获取文件的起始块地址,并将数据写入起始块。
若文件大小超过起始块的容量,则按照一定的分配算法继续分配空间。
4.4 文件分配算法文件分配算法决定了操作系统如何管理文件的空间分配。
常用的文件分配算法包括顺序分配、分配和索引分配。
顺序分配将文件连续地存储在磁盘上,易于实现但可能产生外部碎片。
分配使用链表结构将文件存储在磁盘的不连续块中,不易产生外部碎片但可能引起存取时间增长。
索引分配使用索引表将文件存储在磁盘的不连续块中,不易产生外部碎片且存取时间相对较短,但索引表本身需要占用存储空间。
文件管理系统测试工作总结
文件管理系统测试工作总结文件管理系统是企业日常运营中必不可少的一部分,它能够帮助企业高效地管理和存储各种类型的文件和数据。
然而,为了确保文件管理系统的正常运行和稳定性,测试工作显得尤为重要。
在过去的一段时间里,我们团队对文件管理系统进行了全面的测试工作,现在我将对这次测试工作进行总结。
首先,我们对文件管理系统的功能进行了全面的测试。
我们验证了系统的基本功能,包括文件的上传、下载、删除、搜索等,以及一些高级功能,比如版本控制、权限管理等。
通过这些测试,我们确认了系统的基本功能是正常可用的,并且在高负载情况下也能够稳定运行。
其次,我们进行了一系列的性能测试。
我们模拟了不同规模的用户并发访问系统,测试了系统在不同负载情况下的性能表现。
通过这些测试,我们找到了系统的性能瓶颈,并对其进行了优化,以确保系统在高负载情况下也能够保持稳定的性能。
此外,我们还对系统的安全性进行了全面的测试。
我们模拟了各种攻击手段,比如SQL注入、跨站脚本攻击等,以测试系统对安全漏洞的防范能力。
通过这些测试,我们发现了一些安全漏洞,并及时对其进行了修复,以确保系统的安全性。
最后,我们对系统的兼容性进行了测试。
我们测试了系统在不同操作系统、不同浏览器、不同设备上的兼容性,以确保系统能够在各种环境下正常运行。
通过这次测试工作,我们发现了一些问题并及时进行了修复和优化,最终确保了文件管理系统的稳定性、性能和安全性。
我们将继续对系统进行测试工作,以确保系统能够持续稳定地运行。
同时,我们也将不断优化测试工作的流程和方法,以提高测试工作的效率和准确性。
希望通过我们的努力,能够为企业的文件管理工作提供更加可靠和高效的支持。
文件存储管理系统的设计与实现
文件存储管理系统的设计与实现1. 引言文件存储管理是现代信息技术重要的组成部分,对于许多组织和个人来说,文件存储和管理是非常关键的任务。
随着数字化时代的到来,文件的存储、管理和安全性备份变得尤为重要。
本文将介绍一个文件存储管理系统的设计与实现,旨在提供高效、安全和可靠的文件存储和管理解决方案。
2. 系统需求分析在设计文件存储管理系统之前,首先需要明确系统的需求和目标。
根据实际使用场景,我们对文件存储管理系统的需求进行了分析如下:2.1 可靠性:系统需要具备高可靠性,能够确保文件的完整性和持久性存储。
在系统崩溃或网络故障的情况下,系统应能自动恢复和保护文件数据。
2.2 安全性:系统需要提供强大的安全性措施,包括用户身份验证、权限管理和数据加密等功能。
只有经过授权的用户才能访问和修改文件,确保文件的机密性和完整性。
2.3 可扩展性:系统需要具备良好的可扩展性,能够支持多用户、大容量和高并发的文件存储和访问需求。
随着用户数量和数据量的增长,系统应能够快速响应并提供优质的服务。
2.4 管理性:系统需要提供便捷的管理功能,包括文件上传、下载、删除、查询和移动等操作。
管理员应能够轻松地监控系统的运行状态和文件存储情况。
3. 系统设计与实现基于以上需求分析,我们设计了一个文件存储管理系统,具体如下:3.1 系统架构系统采用分布式架构,包括前端应用服务器、后端存储服务器和数据库服务器。
前端应用服务器负责接收用户请求,进行身份验证和权限控制,然后将文件存储请求转发给后端存储服务器。
后端存储服务器负责具体的文件存储和管理操作,包括文件上传、下载、删除和移动等。
数据库服务器用于存储系统的元数据和用户相关信息。
3.2 用户身份验证与权限管理系统提供用户身份验证和权限管理功能,保证只有经过授权的用户才能访问和操作文件。
用户登录时需要提供用户名和密码进行身份验证,系统根据用户权限设置允许或禁止对文件的访问和操作。
3.3 文件存储和管理系统采用分布式文件存储方式,将文件切分为多个小块并分散存储在不同的后端存储服务器中,确保文件的完整性和持久性存储。
《Linux实验教程》教学课件 第7章 文件系统的设计与实现
Ext2文件系统(4)
块组描述符 – 每个块组都有一个块组描述符ext2_group_desc,记录该
块组的以下信息: – 数据块位示图。表示数据块位示图占用的块号,此位示
图反映块组中数据块的分配情况,在分配或释放数据块 时需使用数据块位示图。 – inode位示图。表示inode位示图占用的块号,此位示图反 映块组中inode的分配情况,在创建或删除文件时需使用 inode位示图。 – inode表。块组中inode占用的数据块数,系统中的每个文 件对应一个inode,每个inode都由一个数据结构来描述。 – 空闲块数、空闲inode数和已用数目。 – 一个文件系统中的所有块组描述符结构组成一个块组描 述结构表,每个块组在其超级块之后都包含一个块组描 述结构表的副本,实际上,Ext2文件系统仅使用块组1中 的块组描述结构表。
– 文件和文件系统 – 文件分类和属性 – 文件控制块和文件目录
UNIX类文件系统和非UNIX类文件系统
• UNIX类文件使用四种和文件系统相关的抽象概念: 文件、目录项、索引节点和安装点。
• 文件(file)—文件是由文件名标识的有序字节串,典 型的配套文件操作有读、写、创建和删除等。
• 目录项(dentry)—是文件路径名中的一部分。 • 索引节点(inode)—是存放文件控制信息的数据结构,
又分磁盘块中的inode和主存中活动的inode。 • 安装点(mount point)—文件系统被安装在一个特定
的安装点上,所有的已安装文件系统都作为根文件 系统树中的叶子出现在系统中。
主要内容
• 背景知识 – 文件系统基本概念 – 文件管理的数据结构 – Ext2文件系统
• 实验内容 – 模拟实现一个Linux文件系统
操作系统试验模拟文件管理系统
操作系统试验摹拟文件管理系统一、引言文件管理是操作系统中的重要组成部份,它负责对计算机中的文件进行组织、存储和访问。
摹拟文件管理系统是为了更好地理解文件管理的原理和实现方式而设计的一个实验项目。
本文将详细介绍摹拟文件管理系统的设计和实现。
二、设计目标1. 实现基本的文件管理功能,包括文件的创建、删除、打开和关闭。
2. 实现文件的读写操作,包括顺序读写和随机读写。
3. 实现文件的共享和保护机制,确保多个进程可以同时对同一个文件进行读写操作。
4. 实现文件的索引和目录结构,方便文件的查找和管理。
5. 实现文件的存储管理,包括空暇空间管理和磁盘分配算法。
三、系统设计1. 文件的创建和删除在摹拟文件管理系统中,可以通过命令行或者图形界面来创建和删除文件。
创建文件时,系统会为该文件分配一个惟一的文件标识符,并在文件目录中记录该文件的相关信息。
删除文件时,系统会释放该文件占用的存储空间,并从文件目录中删除该文件的记录。
2. 文件的打开和关闭在摹拟文件管理系统中,可以通过命令行或者图形界面来打开和关闭文件。
打开文件时,系统会根据文件标识符在文件目录中查找该文件的相关信息,并将该文件的描述符返回给用户进程。
关闭文件时,系统会释放该文件的描述符,并更新文件的相关信息。
3. 文件的读写操作在摹拟文件管理系统中,可以通过命令行或者图形界面来进行文件的读写操作。
顺序读写是指按照文件的存储顺序挨次读取或者写入文件的内容,而随机读写是指根据文件的索引或者偏移量来读取或者写入文件的内容。
系统会根据用户进程的读写请求,将相应的数据从磁盘中读取或者写入到内存中。
4. 文件的共享和保护机制在摹拟文件管理系统中,多个进程可以同时对同一个文件进行读写操作。
系统会通过锁机制来实现文件的共享和保护。
当一个进程正在对文件进行读写操作时,其他进程需要等待该进程释放文件的锁才干对文件进行读写操作。
同时,系统还可以设置文件的访问权限,确保惟独具有相应权限的进程才干对文件进行读写操作。
文件管理实验报告
文件管理实验报告文件管理实验报告一、引言文件管理是计算机科学中一个重要的领域,它涉及到对文件的创建、存储、检索和删除等操作。
在这个实验中,我们将通过模拟文件管理系统来了解文件管理的基本原理和技术。
二、实验目的本实验的主要目的是通过设计和实现一个简单的文件管理系统,加深对文件管理的理解,并掌握文件的创建、读写、删除等基本操作。
三、实验过程1. 文件的创建在文件管理系统中,文件的创建是一个重要的操作。
我们首先需要确定文件的名称和文件的类型。
在实验中,我们选择了一个文本文件作为示例。
通过调用系统提供的文件创建函数,我们可以在指定的目录下创建一个新的文本文件。
2. 文件的读写文件的读写是文件管理的核心操作之一。
在实验中,我们使用了C语言的文件读写函数来实现对文件的读写操作。
首先,我们需要打开文件,然后可以使用读取函数来读取文件中的内容,或者使用写入函数来向文件中写入内容。
最后,我们需要关闭文件,以确保文件的完整性和安全性。
3. 文件的删除文件的删除是一个常见的操作。
在实验中,我们通过调用系统提供的文件删除函数来删除指定的文件。
在删除文件之前,我们需要确保文件已经关闭,并且没有其他进程正在使用该文件。
通过删除文件,我们可以释放磁盘空间,并且保持文件系统的整洁。
四、实验结果通过实验,我们成功地创建了一个简单的文件管理系统,并实现了文件的创建、读写和删除等基本操作。
我们可以通过系统提供的命令来查看文件的属性和内容,以及进行其他操作。
五、实验总结通过这次实验,我们深入了解了文件管理的原理和技术。
文件管理是计算机科学中一个重要的领域,它涉及到对文件的创建、存储、检索和删除等操作。
掌握文件管理的基本原理和技术对于我们理解计算机系统的运行机制和提高工作效率都具有重要意义。
在实验中,我们通过设计和实现一个简单的文件管理系统,加深了对文件管理的理解,并掌握了文件的创建、读写、删除等基本操作。
通过实验结果的验证,我们证明了文件管理系统的可行性和有效性。
C语言编写的文件系统
C语言编写的文件系统在计算机科学领域,文件系统是一种用于组织、存储和访问计算机上的文件和目录的方法。
文件系统可以通过使用文件和目录的层次结构来帮助用户更好地管理和组织文件。
在本文中,我们将探讨使用C语言编写文件系统的过程和技术。
一、概述C语言是一种通用的高级编程语言,被广泛应用于系统编程和底层开发。
使用C语言编写文件系统可以使我们更好地理解文件系统的内部工作原理,并具备良好的性能和灵活性。
下面我们将介绍C语言中一些常用的文件系统相关的数据结构和函数。
二、文件系统数据结构1. 文件控制块(FCB):文件控制块是文件系统中的关键数据结构,用于描述文件的属性和相关信息,如文件名、大小、权限等。
我们可以使用结构体来定义文件控制块,并利用指针进行链接和管理。
示例:```ctypedef struct {char filename[MAX_FILENAME_LENGTH];int size;int permission;// 其他属性和信息} FileControlBlock;```2. 目录项:目录项用于存储文件和目录的相关信息以及它们在文件系统中的位置。
每个目录项通常包含文件名、文件类型、起始盘块号等。
示例:```ctypedef struct {char filename[MAX_FILENAME_LENGTH];FileType type;int start_block;// 其他信息} DirectoryEntry;```3. 磁盘块:磁盘块是文件系统中的最小存储单位,文件和目录的数据都存储在磁盘块中。
我们可以使用结构体模拟磁盘块,其中包含一个数据缓冲区用于存储实际的文件内容。
示例:```ctypedef struct {char data[BLOCK_SIZE];} DiskBlock;```三、文件系统操作函数1. 创建文件:通过调用适当的函数,我们可以在文件系统中创建一个新文件,并为其分配一个唯一的文件名和控制块。
文件管理实验报告
昆明理工大学信息工程与自动化学院学生实验报告(2012 —2013 学年第二学期)课程名称:操作系统开课实验室:年月日一、实验目的用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验原理及基本技术路线图(方框原理图)用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。
文件通常存放在外存(如磁盘、磁带)上,可以作为一个独立单位存放和实施相应的操作(如打开、关闭、读、写等)。
为了加快对文件的检索,往往将文件控制块集中在一起进行管理。
这种文件控制块的有序集合称为文件目录。
文件控制块就是其中的目录项。
下图示例一种目录的组织形式。
模拟一个文件系统,包括目录文件,普通文件,并实现对它们的一些基本操作。
假定每个目录文件最多只能占用一个块;一个目录项包括文件名(下一级目录名),文件类型,文件长度,指向文件内容(下一级目录)的指针内容。
普通文件可以只用目录项(FCB)代表。
三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台四、实验方法、步骤//利用交互式命令实现树型目录结构和文件管理,同时利用位示图表示外存的分配情况,新建文件时分配必要的空间,模拟文件分配表记录文件在外存上的存储方式。
了解系统对文件的操作。
//在文件中保存目录内容,创建文件或子目录可以用命令行命令:MD、CD、RD、MK(创建文件)、DEL(删除文件)和DIR#include<iostream>#include<stdlib.h>#include<time.h>#include <locale.h>using namespace std;#define beginsize 5#define LENGTH 3typedef struct{i nt data[LENGTH];}Indireone;typedef struct{I ndireone * first[LENGTH];}Indiretwo;typedef struct{I ndiretwo * second[LENGTH]; }Indirethree;typedef struct Node{i nt begin[beginsize];I ndireone * one;I ndiretwo * two;I ndirethree * three;}Mixtab;typedef struct NODE{c har name[50];i nt type;//是文件还是目录i nt size;//如果是文件给出大小s truct NODE *next;//兄弟结点s truct NODE * sub;//子节点s truct NODE * father;//父亲节点M ixtab * table;}FCB;//文件控制块FCB * root;FCB * present;FCB * finding;char stringname[300];int Bitmap[16][16];//位示图int leftbit=0;void Initall(){i nt i,j;s rand( time(NULL) );f or(i=0;i<16;i++){//初始化位示图for(j=0;j<16;j++){Bitmap[i][j]=rand()%2;}}r oot=(FCB *)malloc(sizeof(FCB)); s trcpy(root->name,"\\");r oot->type=0;r oot->size=0;r oot->next=NULL;r oot->father=root;r oot->sub=NULL;f or(i=0;i<16;i++){for(j=0;j<16;j++){if(Bitmap[i][j]==0){leftbit++;}}}}//判断分配外存时候是不是足够int Judgeenough(int n){i f(leftbit>=n)return 1;e lse return 0;}//添加时候用void Addpoint(FCB * f){F CB * temp;i f(present->sub==NULL){present->sub=f;}e lse{temp=present->sub;while(temp->next!=NULL){temp=temp->next;}temp->next=f;f->next=NULL;}}//删除时候用void Delpoint(FCB *f){F CB * temp=present->sub;i f(temp==f){present->sub=temp->next;delete(f);}e lse{while(temp->next!=f){temp=temp->next;}temp->next=f->next;delete(f);}}//查找是不是已经存在int Isexist(char ary[],int x){F CB * temp;i f(present->sub==NULL){return 0;}e lse{temp=present->sub;while(temp!=NULL){if((!strcmp(temp->name,ary))&&(temp->type==x)){finding=temp;return 1;}temp=temp->next;}return 0;}}void Mdlist(){c har listname[50];c in>>listname;F CB * temp;i f(Isexist(listname,0)){cout<<"子目录或文件"<<listname<<"已存在。
操作系统课程设计题目与要求1
操作系统课程设计题目与要求一、课程设计要求:1.根据每道题的人数选定题目。
2.分析设计要求,给出解决方案,建立必要的数据结构,然后设计总体流程(包括界面)、详细设计必要的算法,并最终显示结果。
基于WINDOWS或LINUX操作系统都可以,用何种编程语言都有可以。
3.提交设计报告,包括设计要求、设计思想流程、设计所涉及的主要数据结构、程序清单、运行结果、设计心得、参考资料等。
4.严禁抄袭,复制设计内容,查出后相关同学设计成绩以零分处理。
5.所提交源程序应是能够运行通过的完整程序。
6.课程设计参考评分标准:设计思想说明(10分);数据结构的说明(6分);各模块的算法流程图(10分);程序清单:注意加注释(包含关键字、方法、变量等),在每个模块前加注释;(共70分,其中书面源程序占35分,实验的检查结果、程序的运行情况占35分)体会,总结及体会建议(4分)。
二、设计题目1.Windows多线程控制台程序(1人)目的:学习和掌握如何编写Windows多线程控制台程序。
通过编写程序,加深对进程和线程关系的理解,掌握多线程程序的执行和编写技巧。
设计要求:写一个单进程多线程的Windows控制台程序,该程序在一个进程内建立N个线程来执行指定的任务。
N由命令行传递给系统。
Win32控制台程序中,主函数的格式如:Void main(int argc,char *argv[]),可以获取命令行参数。
通过VC++“工程/设置”的C/C++属性页设置应用程序为“MTD”多线程。
利用win32 API CreateThread()来生成线程。
2.睡眠理发师问题(2人)目的:了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。
设计要求:(1)编写程序实现理发师与顾客进程的同步。
问题描述:这是一种经典的IPC问题,理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。
如果没有顾客,则理发师在理发椅上睡觉,顾客理来时,如理发师闲则理发,否则如有空椅则坐等,没有空椅则离开,编写程序实现理发师和顾客程序,实现进程控制,要求不能出现竞争。
文件实验报告
昆明理工大学信息工程与自动化学院学生实验报告( 2011 —2012 学年第二学期)一、实验目的用c或c++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验原理及基本技术路线图(方框原理图)用c模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。
请加上程序功能结构图、流程图、数据结构定义、主要变量的说明、函数的说明等流程图: 主要数据结构界面采用vc6 mfc环境开发#define maxfile 20 //每个用户最多保存20个文件 #define maxuser 10 //假想文件系统最多支持的人数 #define blocksize 32 //虚拟磁盘中物理块为每块32字节#define disksize blocksize*1000 //虚拟磁盘容量为1000*32=32k struct ufd //说明文件项的结构数组 { 节};struct mfd { };struct headblock { };struct block //虚拟磁盘的物理块数据结构 { byte pstack; //堆栈指针short pblock[10]; //块号 pblock[10]是下一个盘块号逻辑地址 char username[10];//主目录用户名 bool isexist; //该用户否存在 ufd ufd[maxfile]; //用户文件数组 ushort nitem;//ufd个数 char filename[15]; char time[16]; //文件建立或修改时间如2003/5/6 12:00 bool isexist;//文件是否存在,删除时标为0bool isshared; //共享标记,共享文件可被其它用户所访问 bool attrread;//文件是否可读 bool attrwrite; //文件是否可写 bool attrexecute; //文件是否可执行htreeitem treenode; //用于树控件显示的结点句柄 ushort filelen; //文件占用字节数 ushort blocknum; //文件占用的物理块数ushort filelink[100];//文件物理块地址数组,每块32字节,限定一个文件最大100*32=3200字union{ };struct fat { };//空闲块成组链接法bool openlist[maxuser][maxfile]; //描述文件是否打开的布尔型数组 fat filefat;//描述文件记录项的fat结构cfile fatio; //负责和vdisk.dat打交道的文件句柄 cstringcurrentuser; //当前登录的用户名int currentid; //前前登录的用户标识号block superblock; //超级块,指示第一个空闲块逻辑号 ushort maxopen;//该用户同时可打开的最大文件数 ushort usernum; //最户数mfd mfd[maxuser]; //最多可支持10个用户 byte block[32]; //一块为32字节 headblock headinfo; };说明:本实验采用模拟文件结构的方法,把记录用户帐号,用户文件和磁盘块的信息用当前目录下的vdisk.dat来记录,可以把vdisk.dat看成是一个虚拟的磁盘,其头部是fat结构,用来记录各个用户和文件信息,紧接着是空闲块成组链接法的数据结构,每块32字节,每组10块,共1000块,也就是说,用户文件数据的总容量是32*1000字节,如果程序当前目录下找不到用于做实验用的vdisk.dat,在登录时程序会提示是否“格式化虚拟磁盘”也就是新建一个vdisk.dat文件,接着,程序会显示“用户管理”的窗口,此时应新建几个帐号用于登录做实验。
文档管理系统方案
(3)开展用户培训,提高用户操作能力。
4.系统部署与运维
(1)选择合适的时间窗口,进行系统部署。
(2)持续关注系统运行状况,优化性能,确保高效运行。
(3)提供技术支持和运维服务,解决用户问题。
六、项目保障
1.组织保障
(1)成立项目组,明确项目成员职责。
2.系统设计
(1)根据需求分析,设计系统架构和功能模块。
(2)制定系统安全策略,确保合法合规。
(3)设计用户界面,提高用户体验。
3.系统开发与测试
(1)采用敏捷开发方法,分阶段完成系统开发。
(2)进行系统功能测试,确保系统稳定可靠。
(3)开展用户培训,提高用户操作能力。
4.系统部署与运维
(1)选择合适的时间窗口,进行系统部署。
(4)扩展性:系统具备良好的扩展性,可适应企业规模和业务需求的变化。
三、系统功能
1.文档存储
(1)支持多种文件格式,如Word、Excel、PDF等。
(2)提供文件分类和标签功能,便于用户对文档进行归类和检索。
(3)实现文档的版本控制,记录文档历史版本,支持版本回溯。
2.文档检索
(1)提供全文搜索功能,支持关键词、条件组合等多种检索方式。
3.高效便捷:以用户为中心,优化操作流程,提高工作效率。
4.可扩展性:考虑企业未来发展需求,确保系统具备良好的可扩展性。
四、系统功能模块
1.文档管理
(1)支持多种文件格式,满足不同类型文档的存储需求。
(2)提供文档分类、标签和归档功能,便于用户快速检索。
(3)实现文档版本控制,支持历史版本查看和回溯。
文档管理系统方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟文件管理系统-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII目录一.课程设计目的 (3)二.课程设计要求 (3)三.设计思想及流程 (5)四.数据结构 (5)五.详细设计 (8)六.程序源代码 (10)七.运行结果 (26)八.课程设计心得 (30)九.参考文献 (30)一.课程设计目的深入了解文件管理系统,初步掌握文件管理系统的实现方法。
用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二.课程设计要求编写一程序,模拟一个简单的文件管理系统。
树型结构,目录下可以是目录,也可以是文件。
在此文件管理系统,可实现的操作有:改变目录:格式:cd <目录名>显示目录:格式:dir <目录名>创建目录:格式:md <目录名>删除目录:格式:rd <目录名>新建文件:格式:edit <文件名>删除文件:格式:del <文件名>退出文件系统:exit1.文件系统采用二叉树型存储结构,结点结构如下:struct FileNode{char filename[FILENAME_LEN];//文件名/目录名int isdir;//目录、文件的识别标志(0为文件,1为目录)int i_nlink;//文件的链接数//int adr;//文件的地址struct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向后一个兄弟的指针.};2.目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开3.功能具体描述:改变目录:改变当前工作目录,目录不存在时给出出错信息显示目录:显示指定目录下或当前目录下所有文件和一级目录(选做:带/s参数的dir命令,显示所有子目录)创建目录:在指定路径或当前路径下创建指定目录。
重名时给出错信息。
删除目录:删除指定目录下所有文件和子目录。
要删目录不空时,要给出提示是否要删除。
创建文件:创建指定名字的文件,只要创建表示文件的节点即可,内容及大小不考虑。
删除文件:删除指定文件,不存在时给出出错信息。
退出文件系统:exit4、总体流程:初始化文件目录;输出提示符,等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
三.设计思想及流程1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。
2.文件存储空间的分配采用显式链接分配。
为了实现创建和删除文件必须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件。
3. 数据结构与树结构。
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。
树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。
结点的前趋结点称为该结点的"双亲",结点的后趋结点称为该结点的"孩子",同一结点的"孩子"之间互称"兄弟"。
4.文件目录结构采用多级目录结构。
为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指5. 要有分解函数对输入的命令进行分解。
以识别那部分是哪部分是命令,哪部分是路径和文件名。
6. 最后要有执行函数。
来执行输入的创建文件命令。
四.数据结构1.文件结构体struct FileNode{char filename[FILENAME_LEN];//文件名/目录名int isdir;//目录文件识别标志int i_nlink;//文件的链接数int adr;//文件的地址struct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向//后一个兄弟的指针.};整个文件系统采用二叉树型存储结构,初始化文件树如下:图 4-1 初始目录树2.所使用函数及其功能int Main(); //主函数void Init();//初始化文件树int ParseCommand();//接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();//执行命令,分别执行cd,edit,md,del,rd, dir,exit命令int cdComd(); //改变目录功能处理int editComd();//处理edit命令,即创建文件,只要创建表示文件的节点即可,内容及大小不考虑int mdComd(); //创建目录int delComd();//处理del命令,即删除指定文件,不存在是给出错误信息int dirComd();//处理dir命令,显示目录int rdComd(); //删除目录int FindFilename(char Para2[]);//查找文件名struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//创建结点int GetInput(char* buffer,unsigned int buffer_len);//获取输入3.所使用的变量struct FileNode *cp, *tp, *root;// *cp, *tp, *root是根目录节点char path[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径char Para1[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];//para1数组存储输入的命令,para2数组存储输入的文件名char filename[FILENAME_LEN],tmp;unsigned int i,j;五.详细设计图5-1 主函数流程图2)edit()创建文件函数流程图图5-2 创建文件函数流程图图5-3 删除函数流程图开始检查命令格式获取文件名字不存在删除的由用户报错提示处理删除是第处理删除不是结束4)ParseCommand()分解命令函数流程图图5-4 分解命令函数流程图六.程序源代码#include <stdio.h>#include <iostream>#include <string.h>#include <ctype.h>#include <stdlib.h>#define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11using namespace std;void Init();//初始化文件树int ParseCommand();//接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();//执行命令int cdComd();//处理cd命令int editComd();//处理edit命令int delComd();//处理del命令int dirComd();//处理dir命令int mdComd();//处理md命令int rdComd();//处理rd命令int FindPath(char *ph);//寻找参数ph所指向的路径int FindFilename(char Para2[]);//从参数Para2中找到要建立或删除的文件、目录名,并把指针只想其父亲结点struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//创建结点int GetInput(char* buffer,unsigned int buffer_len);//获取输入int CheckCommand();//命令检查int GetDir(int begin,char *path,char *curDir);//获取路径struct FileNode *cp, *tp, *root;char path[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径char Para1[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];char curpath[INPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LEN]; char filename[FILENAME_LEN],tmp;unsigned int i,j;//int i,j;struct FileNode //结点结构{char filename[FILENAME_LEN];//文件名/目录名int isdir;//目录文件识别标志int i_nlink;//文件的链接数struct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向后一个兄弟的指针.};//创建结点struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink) {struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode));//申请结点空间//相应内容赋初值strcpy(node->filename,filename);node->isdir=isdir;node->i_nlink=i_nlink;node->parent=NULL;node->child=NULL;node->sibling_prev=NULL;node->sibling_next=NULL;return node;}//初始化文件树void Init() {struct FileNode *binNode,*usrNode,*unixNode,*etcNode,*libNode,*userNode,*binNode2,*liuNode,*sunNode,*ftiNode;strcpy(path,"/"); //根目录写入当前路径//创建文件树的结点binNode=CreateFileNode("bin",1,0);usrNode=CreateFileNode("usr",1,0);unixNode=CreateFileNode("unix",0,0);etcNode=CreateFileNode("etc",1,0);libNode=CreateFileNode("lib",1,0); userNode=CreateFileNode("user",1,0); binNode2=CreateFileNode("bin",1,0); liuNode=CreateFileNode("liu",1,0); sunNode=CreateFileNode("sun",1,0);ftiNode=CreateFileNode("fti",1,0);cp=tp=root=CreateFileNode("/",1,0);//结点相应内容赋值root->parent=NULL;root->child=binNode;root->sibling_prev=root->sibling_next=NULL; binNode->parent=root;binNode->child=NULL;binNode->sibling_prev=NULL;binNode->sibling_next=usrNode;usrNode->parent=NULL;usrNode->child=libNode;usrNode->sibling_prev=binNode;usrNode->sibling_next=unixNode; unixNode->parent=NULL;unixNode->child=NULL;unixNode->sibling_prev=usrNode; unixNode->sibling_next=etcNode;etcNode->parent=NULL;etcNode->child=NULL;etcNode->sibling_prev=unixNode;etcNode->sibling_next=NULL;libNode->parent=usrNode;libNode->child=liuNode;libNode->sibling_prev=NULL;libNode->sibling_next=userNode;userNode->parent=NULL;userNode->child=NULL;userNode->sibling_prev=libNode; userNode->sibling_next=binNode2;binNode2->parent=NULL;binNode2->child=NULL;binNode2->sibling_prev=userNode;binNode2->sibling_next=NULL;liuNode->parent=libNode;liuNode->child=NULL;liuNode->sibling_prev=NULL;liuNode->sibling_next=sunNode;sunNode->parent=NULL;sunNode->child=NULL;sunNode->sibling_prev=liuNode;sunNode->sibling_next=ftiNode;ftiNode->parent=NULL;ftiNode->child=NULL;ftiNode->sibling_prev=sunNode;ftiNode->sibling_next=NULL;}//获取文件或目录名,并把指针指向其父亲结点int FindFilename(char Para2[]) {i=strlen(Para2)-1;j=0;while(Para2[i]!='/'&& i>=0) {filename[j]=Para2[i];i--; j++;}filename[j]='\0';//获得逆序的文件或目录名,存入filename中if(i<0) Para2[i+1]='\0';else Para2[i]='\0';j--;for(i=0;i<strlen(filename)/2;i++,j--) { //filename逆转,获得正确的文件或目录名tmp=filename[i];filename[i]=filename[j];filename[j]=tmp;}if(strlen(Para2)>0) { //查找路径int sign=FindPath(Para2);if(sign==0)return 0;}return 1;}//缓冲区安全输入子函数//如果输入超过buffer_len,则截取前buffer_len-1长度的输入,//buffer_len处字符用'/0'代替int GetInput(char* buffer,unsigned int buffer_len) {unsigned int count=0;while(count<buffer_len) {if((buffer[count]=getchar())==10) {buffer[count]='\0';return count;}count++;}while(getchar()!=10);buffer[buffer_len-1]='\0';return -1;}//改变目录函数int cdComd() {if(!CheckCommand()) //命令检查return 0;if(strcmp(Para2,"..")==0) { //对cd..命令的处理int i;while(cp->sibling_prev)cp=cp->sibling_prev;if(cp->parent){ cp=cp->parent; } //找到父亲结点else{ return 0; }//对当前路径进行相应处理i=strlen(path);while(path[i]!='/'&&i>0) i--;if(i!=0)path[i]='\0';elsepath[i+1]='\0';}else {FindPath(Para2);//查找路径}return 1;}//创建目录函数int mdComd() {struct FileNode * temp,*tp;temp=CreateFileNode("",1,0);int sign;if(strlen(Para2)==0) { //参数不能为空printf("\n命令格式有错误.\n");return 0;}if(strlen(Para2)>20) { //长度检查printf("\n目录名过长\n");return 0;}//格式检查if (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/')) { printf("目录名格式有错!\n");/* 目录首字母可以为'字母'或'数字'或'/'*/return 0;}sign=FindFilename(Para2); //获取目录名if(sign==0)return 0;if(cp->isdir!=1) { //如当前指针指向的是文件,则报错printf("you cannot edit a directory in under a file!\n");return 0;}tp=CreateFileNode(filename,1,0); //创建目录结点,并插入到指定目录下if(cp->child==NULL) {tp->parent=cp;tp->child=NULL;cp->child=tp;tp->sibling_prev=NULL;tp->sibling_next=NULL;}else {temp=cp;//用temp找到新结点插入处temp=temp->child;while(temp->sibling_next ) { //find the last sibing nodetemp=temp->sibling_next;if(strcmp(temp->filename,filename)==0&&temp->isdir==1) {printf("此目录名已存在\n");//重名报错return 0;}}//找到了最后一个结点temp->sibling_next=tp;tp->parent=NULL;tp->child=NULL;tp->sibling_prev=temp;tp->sibling_next=NULL;}return 1;}//删除目录函数int rdComd() {int sign;struct FileNode *temp;char cmd[2];if(!CheckCommand()) //命令检查return 0;sign=FindFilename(Para2); //获取目录名if(sign==0) return 0;if(cp->child) { //用temp指向要删除的结点temp=cp->child;while(temp->sibling_next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=1))temp=temp->sibling_next;if(strcmp(temp->filename,filename)!=0) {printf("不存在该目录!\n");return 0;}}else {printf("不存在该目录!\n");return 0;}if(temp->isdir!=1) { //要删除的不能是文件printf("ERROR!该命令只能删除目录,不可删除文件!\n");return 0;}if(temp->child) { //如仍有用户使用该目录,则不能删除printf("\n该目录不为空,您确定要删除吗?Y/N!\n");GetInput(cmd,2);if(strcmp(cmd,"n")==0||strcmp(cmd,"N")==0)return 0;}//删除工作if(temp->parent==NULL) { //不是第一个孩子temp->sibling_prev->sibling_next=temp->sibling_next;if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->sibling_prev=temp->sibling_prev;temp->sibling_prev=temp->sibling_next=NULL;}//ifelse { //第一个孩子if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->parent=temp->parent;temp->parent->child=temp->sibling_next;}free(temp);return 1;}//显示目录子函数int dirComd() {if(strlen(Para2)>0) {int sign=FindPath(Para2); //查找路径if(sign==0) { return 0; }else{ printf("\n%s>", path); }}if(cp!=root)printf(" <DIR> %s\n","..");if(cp->child==NULL) //指定目录为空{ return 0; }tp=cp;tp=tp->child; //指定目录不为空,显示其所有子目录及文件名while(tp) {if(tp->isdir)printf(" <DIR> %s\n",tp->filename);elseprintf(" <FILE> %s\n",tp->filename);tp=tp->sibling_next;}return 0;}//创建文件函数int editComd() {struct FileNode * temp=CreateFileNode("",0,0);int sign;struct FileNode *tp;if(strlen(Para2)==0) { //路径不能为空printf("\n命令格式有错误.\n");return 0;}if(strlen(Para2)>20) { //长度检查printf("\n文件名过长\n");return 0;}//格式检查if (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/')) {printf("文件名格式有错!\n");/* 文件首字母可以为'字母'或'数字'或'_'或'/'或'回车'*/return 0;}sign=FindFilename(Para2);//获取文件名if(sign==0)return 0;if(cp->isdir!=1) { //如当前指针指向的是文件,则报错printf("you cannot edit a file in under a file!\n");return 0;}//创建文件结点,并插入到指定目录下tp=CreateFileNode("",1,0);strcpy(tp->filename,filename);tp->isdir=0;tp->i_nlink=0;if(cp->child==NULL) {tp->parent=cp;tp->child=NULL;cp->child=tp;tp->sibling_prev=NULL;tp->sibling_next=NULL;}else {temp=cp;temp=temp->child;//用temp找到新结点插入处while(temp->sibling_next ) { //find the last sibing nodetemp=temp->sibling_next;if(strcmp(temp->filename,filename)==0&&temp->isdir==0) {printf("此文件名已存在,请重新输入\n"); //重名报错return 0;}}//找到了最后一个结点temp->sibling_next=tp;tp->parent=NULL;tp->child=NULL;tp->sibling_prev=temp;tp->sibling_next=NULL;}return 1;}//删除文件子函数int delComd() {int sign;struct FileNode *temp;if(strlen(Para2)==0) { //参数不能为空printf("\n命令格式有错误.\n");return 0;}sign=FindFilename(Para2); //获取文件名if(sign==0) return 0;if(cp->child) { //用temp指向要删除的结点temp=cp->child;while(temp->sibling_next&&(strcmp(temp->filename,filename)!=0||temp->isdir!=0))temp=temp->sibling_next;if(strcmp(temp->filename,filename)!=0) {printf("不存在该文件!\n");return 0;}}else {printf("不存在该文件!\n");return 0;}if(temp->isdir!=0) { //要删除的不能是目录printf("ERROR!该命令只能删除文件,不可删除目录!\n");return 0;}if(temp->i_nlink!=0) { //如仍有用户使用该文件,则不能删除printf("还有用户共享了该文件,不能删除!\n");return 0;}//删除工作if(temp->parent==NULL) { //不是第一个孩子temp->sibling_prev->sibling_next=temp->sibling_next;if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->sibling_prev=temp->sibling_prev;temp->sibling_prev=temp->sibling_next=NULL;}else { //第一个孩子if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->parent=temp->parent;temp->parent->child=temp->sibling_next;}free(temp);return 1;}//获取当前目录名子函数int GetDir(int begin,char *path,char *curDir) {int i=0;int len=strlen(path);while(!((path[begin]=='\\')||(path[begin]=='/'))&&begin<len){ curDir[i++]=path[begin++]; }curDir[i]='\0';return begin+1;}//查找路径函数int FindPath(char *ph) {struct FileNode *temp; //struct FileNode *tp,*temp;char oldpath[INPUT_LEN-COMMAND_LEN];unsigned int i=0; //int i=0int sign=1;if(strcmp(ph,"/")==0) { //ph是根目录cp=root;strcpy(path,"/");return 1;}temp=cp;strcpy(oldpath,path);//保留原路径和指针if(ph[0]=='/') { //指针指向根目录的左孩子cp=root->child;i++; //滤过'/'strcpy(path,"/");}else {if(cp!=NULL&&cp!=root)strcat(path,"/");if(cp&&cp->child) {if(cp->isdir)cp=cp->child;//指针指向当前目录的左孩子else {printf("路径错误!\n");return 0;}}}while(i<=strlen(ph)&&cp) { //继续查找指定路径,如遇到文件则报错int j=0;if(ph[i]=='/'&&cp->child) {i++; //略过'/'if(cp->isdir)cp=cp->child; //继续查找下级目录else {printf("路径错误!\n");return 0;}strcat(path,"/");}while(ph[i]!='/'&&i<=strlen(ph)) { // curpath 记录当前要找的路径名curpath[j]=ph[i];i++; j++;}curpath[j]='\0';while((strcmp(cp->filename,curpath)!=0||(cp->isdir!=1))&&cp->sibling_next!=NULL){ cp=cp->sibling_next; }if(strcmp(cp->filename,curpath)==0) {if(cp->isdir==0) {strcpy(path,oldpath);cp=temp;printf("是文件不是目录.\n");return 0;}strcat(path,cp->filename);}if(strcmp(cp->filename,curpath)!=0||cp==NULL) {strcpy(path,oldpath);cp=temp;printf("输入路径错误\n");return 0;}}return 1;}//命令检查函数int CheckCommand() {if(strlen(Para2)==0) {printf("命令语法不正确.\n");return 0;}return 1;}//分解命令子函数int ParseCommand() {char Inputs[INPUT_LEN];int i=0,j=0,ch;unsigned int k=0;printf("%s>",path);if(GetInput(Inputs,INPUT_LEN)==-1) { //获取输入printf("输入行太长.\n");return 0;}Para1[0]=Para2[0]='\0';//获取参数Para1,即操作名while(Inputs[i]!=' '&&Inputs[i]!='\0'&&i<COMMAND_LEN-1) { Para1[i]=Inputs[i];i++;}Para1[i]='\0';if(i==(COMMAND_LEN-1)) return 1; //输入命令太长if(Inputs[i]!='\0') { //获取参数2,即路径文件名while(Inputs[i]==' '&&i<INPUT_LEN-1) i++; j=0;while(Inputs[i]!='\0'&&i<INPUT_LEN-1) {Para2[j]=Inputs[i];i++; j++;}Para2[j]='\0';}for(k=0;k<strlen(Para1);k++) { //将操作名全部转换成小写字母ch=tolower((int)Para1[k]);Para1[k]=ch;}return 1;}//执行命令函数void ExecuteCommand() {int sign;//根据参数Para1调用相应的功能处理模块if(strcmp(Para1,"cd")==0)sign=cdComd(); //cd命令else if(strcmp(Para1,"edit")==0)sign=editComd(); //edit命令else if(strcmp(Para1,"md")==0)sign=mdComd(); //else if(strcmp(Para1,"del")==0)sign=delComd(); //del命令else if(strcmp(Para1,"rd")==0)sign=rdComd();else if(strcmp(Para1,"dir")==0)sign=dirComd(); //dir命令else if(strcmp(Para1,"exit")==0)exit(0); //exit命令elseprintf("命令错误,请重试\n"); //命令输入不正确,报错}int main() {Init(); //初始化文件树while(1) {if(ParseCommand()) //分解命令ExecuteCommand(); //执行命令}return 0;}七.运行结果1.显示根目录下所有文件和目录图 7-1 当前根目录下目录和文件2.创建目录和文件图 7-2创建目录和文件3.删除目录和文件图 7-3 删除目录和文件4.创建文件重名情况图 7-4 创建文件重名的情况5.改变目录图 7-5 改变目录6.退出系统图 7-6 退出文件系统八.课程设计心得经过几周的时间,课程设计终于完成了,他锻炼了我查阅资料,进行方案构思的能力。