模拟文件系统的设计与实现
文件系统的设计与实现

文件系统的设计与实现随着计算机技术的发展,文件系统在计算机领域中扮演着至关重要的角色。
文件系统是计算机文件管理的核心,负责文件的存储、读取、修改、删除等操作,影响着计算机系统的性能、稳定性和可靠性。
本文将从文件系统的基本原理、设计要求及其实现架构等方面进行探讨。
一、文件系统的基本原理文件系统的基本原理是在计算机中创建一种逻辑结构,将不同类型的文件以数据块的方式存储在硬盘中。
文件系统通过文件夹及目录树等组织方式,将文件组织成系统中易于管理、存储和使用的形式。
同时,文件系统的实现需要考虑文件读写的速度和可靠性,建立合适的文件缓存机制,以加快读写速度,减少硬盘的读写次数,提高文件系统的效率。
文件系统的逻辑结构包含以下几个方面:1. 文件:文件系统将不同的信息类型编码为不同的文件格式,便于用户使用。
在Unix/Linux操作系统中,采用Inode(索引节点)作为文件的描述符,在Windows操作系统中,采用文件描述符来描述文件信息。
2. 文件夹:文件夹是存储文件的逻辑单位,它可以容纳多个文件或多个子文件夹,并通过目录树的形式整合在一起,给予用户更好的组织文件的方式。
3. 文件系统权限:文件系统提供用户权限控制机制,确保有些系统文件只有管理员才可以访问和修改,有些是所有用户都可以访问。
4. 磁盘分区:文件系统通过磁盘分区和分配技术,将硬盘分成多个逻辑区域,每个区域可以容纳不同大小的文件,确保文件系统的可靠性和稳定性。
二、文件系统的设计要求针对文件系统的基本原理,设计一个高效、可靠的文件系统需要考虑以下的设计要求:1. 高效性:对文件的读写、创建、移动、查找等操作进行优化,减少IO操作次数,提高文件系统读写速度。
2. 可靠性:文件系统的数据存储必须是安全、可靠的,确保文件不会因为磁盘损坏、文件系统崩溃等原因丢失,可进行备份和恢复。
3. 易用性:操作便捷、功能丰富的用户界面,以及快捷的文件搜索、复制、黏贴等操作,使用户可以方便地管理和使用文件。
操作系统文件系统的实现及其应用

操作系统文件系统的实现及其应用操作系统是计算机系统的核心部分,负责管理和控制计算机硬件资源,并提供基本的系统服务。
文件系统是操作系统的一个重要组成部分,负责管理和组织存储在计算机硬盘上的数据。
本文将从操作系统文件系统的实现和应用两个方面进行探讨,以深入了解文件系统在操作系统中的重要性及其实际应用。
一、操作系统文件系统的实现1.文件系统的概念文件系统是计算机操作系统中用来管理和组织文件存储的一种方式。
文件系统通过管理文件和目录的命名、存储、检索和保护等操作,为用户提供了存储和检索数据的功能。
文件系统的实现涉及到文件的结构、存储方式、读写操作和安全保护等内容。
2.文件系统的结构文件系统的结构通常包括两个层次:文件的逻辑结构和物理结构。
文件的逻辑结构指的是文件的组织方式,包括文件的命名、组织和目录结构等内容;文件的物理结构指的是文件在存储介质上的存储方式,包括文件的分配、存储结构和读写方式等内容。
在文件系统的实现中,文件的逻辑结构通过文件目录的组织来管理,而文件的物理结构则通过文件分配表和存储控制块等数据结构来实现。
文件分配表用来记录文件在存储介质上的物理位置,而存储控制块则用来存储文件的属性信息和访问权限等内容。
3.文件系统的存储管理文件系统的存储管理是指对文件的存储空间进行有效的分配和管理。
文件系统通常采用磁盘管理的方式来实现文件的分配和存储。
磁盘管理通过对磁盘空间的分区、分配和释放等操作,实现对文件的存储管理。
在文件系统的实现中,通常采用文件分配表和位图两种方式来管理文件的存储空间。
文件分配表通过记录文件的分配情况和存储位置,来实现文件的分配和访问;而位图则通过记录磁盘空闲块的情况,来实现对磁盘空间的管理和分配。
4.文件系统的访问控制文件系统的访问控制是指对文件的访问权限进行管理和控制。
文件系统通常通过访问权限和用户身份验证等方式来实现对文件的访问控制。
在文件系统的实现中,通常采用文件属性和用户身份验证两种方式来实现文件的访问控制。
虚拟文件系统课程设计的研究背景

虚拟文件系统课程设计的研究背景一、引言虚拟文件系统(Virtual File System,VFS)是操作系统中的一个重要组成部分,它为用户和应用程序提供了统一的文件系统接口。
VFS可以隐藏底层文件系统的差异,使得用户可以方便地访问不同类型的文件系统,如磁盘文件系统、网络文件系统等。
虚拟文件系统的设计和实现对于操作系统的性能和可扩展性具有重要影响。
二、虚拟文件系统的概念与特点2.1 虚拟文件系统的定义虚拟文件系统是操作系统中的一个抽象层,它将不同类型的文件系统统一抽象为一个统一的接口,使得用户和应用程序可以通过相同的方式访问不同类型的文件系统。
2.2 虚拟文件系统的特点•统一接口:虚拟文件系统为用户和应用程序提供了统一的文件系统接口,使得它们可以方便地访问不同类型的文件系统。
•隐藏差异:虚拟文件系统可以隐藏底层文件系统的差异,使得用户无需关心底层文件系统的具体实现细节。
•可扩展性:虚拟文件系统的设计可以支持不同类型的文件系统,并且可以方便地添加新的文件系统类型。
•高性能:虚拟文件系统的设计和实现对于操作系统的性能具有重要影响,可以通过优化算法和数据结构来提高文件系统的访问速度。
三、虚拟文件系统的设计与实现3.1 虚拟文件系统的层次结构虚拟文件系统可以分为多个层次,每个层次负责不同的功能。
常见的虚拟文件系统的层次结构包括以下几个层次: 1. 用户接口层:提供用户与文件系统交互的接口,如命令行界面、图形界面等。
2. 文件系统接口层:提供统一的文件系统接口,隐藏底层文件系统的差异。
3. 文件系统抽象层:将底层文件系统抽象为一个统一的接口,提供文件的访问、创建、删除等操作。
4. 文件系统实现层:具体实现不同类型的文件系统,如磁盘文件系统、网络文件系统等。
3.2 虚拟文件系统的功能模块虚拟文件系统的设计包括以下几个功能模块: 1. 文件系统初始化:初始化虚拟文件系统,加载底层文件系统。
2. 文件的访问控制:实现文件的权限控制和访问控制列表。
模拟UNIX文件系统的设计及实现操作系统大作业

模拟UNIX文件系统的设计及实现操作系统大作业UNIX文件系统是一种常见的操作系统文件系统,它提供了一种以层次结构组织文件和目录的方式来管理存储设备上的数据。
为了完成这个大作业,我们需要设计并实现一个简化版的UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。
首先,我们需要设计文件系统的存储结构。
文件系统可以在硬盘上以一个分区的形式存在,我们可以使用一个整数数组来表示硬盘,每个数组元素表示硬盘上的一个块。
我们还可以使用一个超级块来记录文件系统的信息,例如文件系统的状态、块的总数、块的使用情况等。
此外,我们还需要设计并实现一个索引节点表,用于保存文件或目录的元数据信息,例如文件的大小、权限、创建时间等。
接下来,我们需要实现文件和目录的管理功能。
文件和目录可以通过其在索引节点表中的索引来标识。
我们可以使用一个数组来表示目录,数组的每个元素都是一个目录项,记录了文件或子目录的名字和索引节点的索引。
我们还可以使用一个栈来保存当前目录的路径,方便用户在不同目录之间切换。
为了支持目录的嵌套,我们可以在目录项中添加一个指向父目录的索引。
在文件和目录的管理基础上,我们还需要实现文件的读写操作。
文件可以通过其索引节点的索引来标识。
当用户要读取文件时,我们需要根据文件的索引节点找到文件的块地址列表,然后将列表中的块读取到内存中。
当用户要写入文件时,我们需要找到文件的块地址列表中最后一个块,如果该块已满,则需要申请一个新的块,并将新块的地址添加到块地址列表中。
同时,我们还需要更新文件的大小和修改时间等元数据信息。
最后,我们还需要实现文件权限的管理功能。
文件的权限信息可以通过文件的索引节点来保存。
我们可以使用一个整数来表示文件的权限,例如八进制数,每一位代表一个权限,例如读取权限、写入权限和执行权限等。
当用户要访问文件时,我们需要根据用户的权限和文件的权限来判断用户是否具有相应的权限。
总结起来,要完成这个大作业,我们需要设计并实现一个模拟UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。
实现一个简单的文件系统

实现一个简单的文件系统一个简单的文件系统是指一个用于管理文件和文件夹的系统,可以进行基本的文件和文件夹的创建、删除、重命名、查找、打开、关闭等操作。
以下是一个简单文件系统的实现,主要包括文件和文件夹的数据结构和相关操作。
1.数据结构:- 文件(File):包含文件名、文件内容、创建时间、修改时间等属性。
- 文件夹(Folder):包含文件夹名、文件夹路径、创建时间、修改时间等属性,以及包括的文件和文件夹列表。
2.操作:-创建文件夹:可以根据输入的文件夹名和路径,在对应的位置创建一个新的文件夹对象,并将其添加到上级文件夹的文件夹列表中。
-创建文件:可以根据输入的文件名和路径,在对应的位置创建一个新的文件对象,并将其添加到对应的文件夹的文件列表中。
-删除文件夹:可以根据输入的文件夹名和路径,将对应的文件夹对象从上级文件夹的文件夹列表中删除,并删除其包含的所有文件和文件夹。
-删除文件:可以根据输入的文件名和路径,将对应的文件对象从所在文件夹的文件列表中删除。
-重命名文件夹:可以根据输入的原文件夹名和路径以及新文件夹名,将对应的文件夹对象重命名。
-重命名文件:可以根据输入的原文件名和路径以及新文件名,将对应的文件对象重命名。
-查找文件夹/文件:可以根据输入的文件夹名和路径,查找对应的文件夹对象。
-打开文件:可以根据输入的文件名和路径,打开对应的文件对象,并显示其内容。
-关闭文件:可以关闭当前打开的文件。
3.实现:- 定义一个文件夹类(Folder),包含文件夹名、文件夹路径、创建时间、修改时间等属性,以及一个存储文件夹对象的列表。
- 定义一个文件类(File),包含文件名、文件内容、创建时间、修改时间等属性。
- 实现创建文件夹的方法(createFolder),在对应的位置创建一个新的文件夹对象,并将其添加到上级文件夹的文件夹列表中。
- 实现创建文件的方法(createFile),在对应的位置创建一个新的文件对象,并将其添加到对应的文件夹的文件列表中。
操作系统课程设计-一个简单的文件系统的详细设计

计算机系课程设计实验报告课程名称操作系统课程设计实验学期 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. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。
二、课程设计要求1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。
在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。
2文件存储空间的分配可采用显式链接分配或其他的办法。
3空闲磁盘空间的管理可选择位示图或其他的办法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。
文件目录结构采用多级目录结构。
为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
要求提供以下有关的操作命令: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.打开文件函数fopen()(1)格式:FILE *fopen(const char *filename,const char *mode)(2)功能:按照指定打开方式打开指定文件。
(3)输入参数说明:filename:待打开的文件名,如果不存在就创建该文件。
操作系统文件管理实验报告

操作系统文件管理实验报告操作系统文件管理实验报告1:引言本实验报告旨在详细描述操作系统文件管理实验的设计、实施和结果。
文件管理是操作系统的重要组成部分,负责对计算机中的文件进行组织、存储和访问。
本实验通过模拟文件管理的过程,加深对文件管理的理解和实践。
2:实验目的本实验的主要目的是:- 理解文件系统的概念和原理- 掌握文件的创建、读取、写入和删除等基本操作- 实施并测试文件的分配和回收算法- 评估不同的文件分配算法对系统性能的影响3:实验环境本实验的实施环境如下:- 操作系统:Windows 10- 开发环境:C++ 编程语言4:实验内容4.1 文件系统设计在文件系统设计中,首先确定文件的基本单位,例如块或扇区。
然后,定义文件控制块(FCB)结构,用于存储文件的元数据信息,如文件名、大小、创建时间、权限等。
接下来,设计文件分配表,记录系统中每个块的使用情况,用于实现文件的分配和回收。
4.2 文件的创建和删除在文件的创建过程中,首先为文件分配空间,并更新文件分配表。
然后,创建文件的FCB,并将其到目录项中。
在文件的删除过程中,首先释放文件的空间,并更新文件分配表。
然后,删除文件的FCB,并从目录项中移除。
4.3 文件的读写操作文件的读写操作是用户对文件进行读取和修改的过程。
在文件读取操作中,首先找到要读取的文件的FCB,获取文件的起始块地址,并从起始块中读取数据。
在文件写入操作中,首先找到要写入的文件的FCB,获取文件的起始块地址,并将数据写入起始块。
若文件大小超过起始块的容量,则按照一定的分配算法继续分配空间。
4.4 文件分配算法文件分配算法决定了操作系统如何管理文件的空间分配。
常用的文件分配算法包括顺序分配、分配和索引分配。
顺序分配将文件连续地存储在磁盘上,易于实现但可能产生外部碎片。
分配使用链表结构将文件存储在磁盘的不连续块中,不易产生外部碎片但可能引起存取时间增长。
索引分配使用索引表将文件存储在磁盘的不连续块中,不易产生外部碎片且存取时间相对较短,但索引表本身需要占用存储空间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:xxx 学号:xxx设计题目:模拟文件系统的设计与实现起迄日期: 2015年12月28日- 2016年1月8日指导教师:xxx2016 年1月8日1需求分析通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。
模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
2总体设计结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
文件的创建: create 文件关闭:close 文件的打开:open文件的读:read 文件的写:write 文件关闭:close删除文件:delete 创建子目录:mkdir 删除子目录:rmdir列出文件目录:dir 退出:exit系统执行流程图3.详细设计 主要数据结构:#define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024//磁盘块数目1K#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT 表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1//根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct)//根目录大小#define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5//最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KBstruct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/};struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名 8位*/char property; /*属性 1位目录 0位普通文件*/int size; /*文件/目录字节数、盘块数)*/int firstdisk; /*文件/目录起始盘块号*/int next; /*子目录起始盘块号*/int sign; /*1是根目录 0不是根目录*/}directitem[MSD+2];};struct opentable{struct openttableitem{char name[9]; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的大小*/}openitem[MOFN];int cur_size; /*当前打文件的数目*/};管理文件的主要代码:int create(char *name){int i,j;if(strlen(name)>8) /*文件名大于 8位*/return(-1);for(j=2;j<MSD+2;j++) /*检查创建文件是否与已存在的文件重名*/ {if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2) /*文件已经存在*/return(-4);for(i=2;i<MSD+2;i++) /*找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /*无空目录项*/return(-2);if(u_opentable.cur_size>=MOFN) /*打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空闲盘块 j 后退出*/ {if(fat[j].em_disk=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_disk = '1'; /*将空闲块置为已经分配*//*-----------填写目录项-----------------*/strcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firstdisk = j;cur_dir->directitem[i].size = 0;cur_dir->directitem[i].next = j;cur_dir->directitem[i].property = '0';/*---------------------------------*/fd = open(name);return 0;}int open(char *name){int i, j;for(i=2;i<MSD+2;i++) /*文件是否存在*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)return(-1);/*--------是文件还是目录-----------------------*/if(cur_dir->directitem[i].property=='1')return(-4);/*--------文件是否打开-----------------------*/ for(j=0;j<MOFN;j++){if(!strcmp(u_opentable.openitem[j].name,name))break;}if(j<MOFN) /*文件已经打开*/return(-2);if(u_opentable.cur_size>=MOFN) /*文件打开太多*/return(-3);/*--------查找一个空闲用户打开表项-----------------------*/for(j=0;j<MOFN;j++){if(u_opentable.openitem[j].firstdisk==-1)break;}/*--------------填写表项的相关信息------------------------*/u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].size = cur_dir->directitem[i].size;u_opentable.cur_size++;/*----------返回用户打开表表项的序号--------------------------*/return(j);}int close(char *name){int i;for(i=0;i<MOFN;i++){if(!strcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)return(-1);/*-----------清空该文件的用户打开表项的内容---------------------*/strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk = -1;u_opentable.openitem[i].size = 0;u_opentable.cur_size--;return 0;}int write(int fd, char *buf, int len){char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/ char Space = 32;char Endter= '\n';for(i=0;i<len;i++){if(buf[i] == '$')buf[i] = Space;else if(buf[i] == '#')buf[i] = Endter;}/*----------读取用户打开表对应表项第一个盘块号-----------------------*/ item = u_opentable.openitem[fd].firstdisk;/*-------------找到当前目录所对应表项的序号-------------------------*/ for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp = i; /*-存放当前目录项的下标-*//*------找到的item 是该文件的最后一块磁盘块-------------------*/while(fat[item].item!=-1){item =fat[item].item; /*-查找该文件的下一盘块--*/}/*-----计算出该文件的最末地址-------*/first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len){strcpy(first,buf);u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len; }else{for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++){/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];}/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);ilen2 = ilen1/DISKSIZE;modlen = ilen1%DISKSIZE;if(modlen>0)ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE; k++)first[k] = buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k] =buf[k];}fat[item].item = i; /*--找到一块后将它的序号存放在上一块的指针中-*/fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标志位为已分配-*/fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/}/*--修改长度-*/u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}return 0;}int read(int fd, char *buf){int len = u_opentable.openitem[fd].size;char *first;int i, j, item;int ilen1, modlen;item = u_opentable.openitem[fd].firstdisk;ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/for(i=0;i<ilen1;i++)if(i==ilen1-1) /*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];}else /*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];item = fat[item].item; /*-查找下一盘块-*/first = fdisk+item*DISKSIZE;}}return 0;}int del(char *name){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) /*--查找要删除文件是否在当前目录中-*/ {if(!strcmp(cur_dir->directitem[i].name,name))break;}cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/if(i>=MSD+2) /*--如果不在当前目录中-*/return(-1);if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/ return(-3);for(i=0;i<MOFN;i++) /*--如果文件打开,则不能删除,退出-*/{if(!strcmp(u_opentable.openitem[i].name,name))return(-2);}item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/ while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk = '0';item = temp;}/*-----------------释放目录项-----------------------*/cur_dir->directitem[cur_item].sign = 0;cur_dir->directitem[cur_item].firstdisk = -1;strcpy(u_opentable.openitem[cur_item].name,"");cur_dir->directitem[cur_item].next = -1;cur_dir->directitem[cur_item].property = '0';cur_dir->directitem[cur_item].size = 0;return 0;}主函数:int main(){FILE *fp;char ch;char a[100];char code[11][10];char name[10];int i,flag,r_size;char *contect;contect = (char *)malloc(MAX_WRITE*sizeof(char));if((fp=fopen("disk.dat","rb"))==NULL){printf("You have not format,Do you want format?(y/n)");scanf("%c",&ch);if(ch=='y'){initfile();printf("Successfully format! \n");}else{return 0;}}enter();print();show();strcpy(code[0],"exit");strcpy(code[1],"create"); strcpy(code[2],"open");strcpy(code[3],"close"); strcpy(code[4],"write"); strcpy(code[5],"read");strcpy(code[6],"del");strcpy(code[7],"mkdir"); strcpy(code[8],"rmdir"); strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){scanf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a))break;}switch(i){case 0: //退出文件系统free(contect);halt();return 0;case 1: //创建文件scanf("%s",name);flag = create(name);if(flag==-1){printf("Error: \n The length is too long !\n");}else if(flag==-2){printf("Error: \n The direct item is already full !\n");}else if(flag==-3){printf("Error: \n The number of openfile is too much !\n");}else if(flag==-4){printf("Error: \n The name is already in the direct !\n");}else if(flag==-5){printf("Error: \n The disk space is full!\n");}else{printf("Successfully create a file! \n");}show();break;case 2://打开文件scanf("%s",name);fd = open(name);if(fd == -1){printf("Error: \n The open file not exit! \n");}else if(fd == -2){printf("Error: \n The file have already opened! \n");}else if(fd == -3){printf("Error: \n The number of open file is too much! \n");}else if(fd == -4){printf("Error: \n It is a direct,can not open for read or write! \n");}else{printf("Successfully opened! \n");}show();break;case 3://关闭文件scanf("%s",name);flag = close(name);if(flag == -1){printf("Error:\n The file is not opened ! \n");}else{printf("Successfully closed! \n");}show();break;case 4://写文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{printf("Please input the file contect:");scanf("%s",contect);flag=write(fd,contect,strlen(contect));if(flag == 0){printf("Successfully write! \n");}else{printf("Error:\n The disk size is not enough! \n");}}show();break;case 5://读文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{flag = read(fd,contect);if(flag == 0){for(i=0;i<u_opentable.openitem[fd].size;i++){printf("%c",contect[i]);}printf("\t\n");}}show();break;case 6://删除文件scanf("%s",name);flag = del(name);if(flag == -1){printf("Error:\n The file not exit! \n");}else if(flag == -2){printf("Error:\n The file is opened,please first close it ! \n");}else if(flag == -3){printf("Error:\n The delete is not file ! \n");}else{printf("Successfully delete! \n");}show();break;}}}程序运行截图:4.心得体会在设计的过程中,我查询了不少相关资料,不断地发现问题、提出问题、解决问题。