在内存中开辟一个空间作为文件存储器,在其上实现一个简单的文件系统。退出这个文件系统时,需要该文件系统的内容保存到磁盘上,以便下次可以将其恢复到内存中来。
文件存储空间管理可采取显式链接(如FAT)或者其他方法。(即自选一种方法)。
空闲空间管理可采用位图或者其他方法。如果采用了位图,可将位图和FAT表合二为一。
文件目录采用多级目录结构。至于是否采用索引节点结构,自选。目录项目中应包含:文件名、物理地址、长度等信息。同学可在这里增加一些其他信息。
文件系统提供的操作:
- 格式化
- 创建子目录
- 删除子目录
- 显示目录
- 更改当前目录
- 创建文件
- 打开文件
- 关闭文件
- 写文件
- 读文件
- 删除文件
- ……
- 熟悉文件存储空间的管理。
- 熟悉文件的物理结构、目录结构和文件操作。
- 熟悉文件系统管理实现。
- 加深对文件系统内部功能和实现过程的理解。
基于本项目需要能让用户能通过界面来交互与观察运行情况,且系统内部会有大量的信息交互,因此本项目开发环境选择如下:
- 操作系统平台:Windows
- 开发软件:Qt Creator 4.12.4 (Community)
- 开发语言:C++
- 开发使用特性:使用了Qt中的一些库文件(QTreeWidgetItem,QMouseEvent,QtCore,QWidget,QMessageBox等等);通过Qt信号与槽函数的机制来处理系统在调度中产生的信号交互;通过Qt Designer来设计整个项目界面,并实现交互。
对于本文件管理系统,需要有以下性能要求:
- 文件总大小不能超过系统所设定大小,目录与空间管理必须同时进行。
- 文件系统的界面和后端处理必须一致。例如:不能出现显示的树形目录与实际不一样;文件大小与实际不匹配;文件名字与路径不匹配等等。
- 系统在运行过程中,要严格精确的使用所设定的方法进行管理。
- 系统在运行过程中,要避免崩溃,闪退等问题。
- 本系统中文件存储空间管理采取的是显式链接的方法,在内存上存储数据,建立了 Block 类作为存储数据的基本单位,每个Block可以存储64字节的数据,并且定义了设置和获得数据的接口。文件中的内容存放在磁盘不同的块中,每次创建文件时为文件分配数量合适的空闲块。每次写文件时按顺序将文件内容写在相应块中; 删除文件时将原先有内容的位置置为空即可。使用一个FAT表,将一份数据分成几段,存在好几个空闲块中,这些块之间以存储的先后顺序链接在一起,同时文件保存第一个块的索引,在读取时先读取
- 空闲空间管理使用位图的方式,使用BitMap类,并同时将FAT表与位图合二为一,如果某一块为空闲,对应的位图位置标识就为EMPTY=-1;如果某一块保存了一段数据,那么对应的位图位置标识就为总体数据的下一块的位置;特别地,如果某一块是一个文件数据的最后一块,那么对应的位图位置标识就为END=-2。
- 一个FCB对象就代表一个目录项,即一个文件,它保存有文件的一些属性,以及该文件下的第一个子文件,父文件,和该文件在同一路径的下一个文件的位置。总体就是一个多级目录结构。目录保存目录结构的根节点以及当前节点。该目录结构总体是一个左子女右兄弟树,因此可以很方便地创建文件和子文件夹。
- 退出时,将位图和目录进行序列化保存到磁盘中,启动程序时通过反序列化将数据读取,如果读取失败就会创建新的文件管理系统。
- 如果想要新建一个文件或者文本文件,那么在进入目标路径对应的窗口后右键单击就可以新建文件。
- 如果想要删除一个文件或者文本文件,右键单击该文件,选择删除即可。
- 如果要打开一个文件或者文本文件,可以右键单击该文件,选择打开,也可以双击直接打开。
- 如果要重命名一个文件,那么可以右键单击目标文件,选择重命名,在弹出的窗口中写入新名字即可。
- 点击窗口左边树形目录里面的文件结点也可以打开该文件。
- 使用右上角的搜索可以在当前目录下的子树中寻找到第一个寻找到的文件。
- 使用上方的刷新按钮可以刷新窗口状态。
- 使用上方的格式化按钮可以重置本文件系统。
- 左上角的三个按钮可以根据不同的需求返回前一个/后一个/上级目录。
- 打开文本文件后,可以编辑文本,以及对文本进行改变字体,大小与风格,保存,清空,退出等操作。
- 文件管理的实时情况可以通过观察三个窗口得到。