# 基于C#实现的文件管理系统
# 一、项目背景
- 在内存中开辟一个空间作为文件存储器(虚拟磁盘),在其上实现一个简单的文件管理系统
- 退出这个文件系统时,应将文件系统的内容保存在磁盘上,下次将其恢复到内存中
- 文件目录采用多级目录结构
# 二、开发/运行环境
- **开发环境**:Windows10 Pro 1803
- **开发语言**:C# 6.0/ .net Framework 4.7.03056
- **开发工具**:Microsoft Visual Studio Community 2017
# 三、数据结构:块组
由于模拟的磁盘较为简单,所以这里采用单块组,取消了逻辑扇区的数据结构。事实上,这一个块组对象就等价于一个虚拟磁盘。我使用了ext2的设计思想,并做了必要的简化,在细节上与真实的ext2文件系统有所不同。
## 3.1 卷大小
由于简化了操作,将单个块组等价于磁盘,所以将磁盘的容量记录在块组里面。同时这是一个不太严格的说法,这里的卷大小实际上是所有数据块的尺寸之和。
## 3.2 超级块
用于描述文件系统的整体信息
- inode数量
- 空闲inode数量
## 3.3 组描述符表
记录所有的组描述符。
**组描述符**
记录块组中各个描述性质的数据结构的位置,这里用来记录数据块和inode的使用情况。
**块位图**
描述本块组中数据块的使用情况,是一个位向量,1表示数据块已被占用,0表示数据块未被占用。
**inode位图**
描述inode表中inode的使用情况,1表示已被使用,0表示未被使用。
## 3.4 数据块表
记录块组中所有的数据块。
**数据块data**
一个字符型数组,用于存储各种数据,数组大小为2048,实际占用4096字节,因为C#中字符为Unicode编码,每个字符占据2个字节。
## 3.5 inode表
记录块组中所有的inode,数量由超级块给出。
**inode**
表示文件系统树型结构节点:
- 文件类型
- 文件大小
- 文件名
- 文件创建时间
- 文件修改时间
- 文件占用数据块数量
- 占用的数据块索引
- 包含的子文件的inode索引
- 包含的子文件的数量
- 父目录的inode索引
注意,这里的子文件均指第一级子文件,即树型结构中的儿子。
## 3.6 当前目录索引
用于记录用户当前所处的目录的inode索引。由于这是一个单用户系统,所以将这个信息保存在了块组对象中,便于编程实现。
**磁盘映像也是按照这个顺序写入的,保存在与可执行文件同一目录下,名为disk.img,请务必不要随意修改这个文件,否则会导致文件系统读取错误**
# 四、GUI设计及使用说明
整个文件管理系统包含四个窗口:
- **主窗口**:展示当前目录下的文件和子目录列表,以及各种操作对应的按钮
- **输入窗口**:用于输入文件或子目录的名称
- **文件查看和编辑窗口**:用于进行文件查看和编辑
- **文件详情窗口**:用于查看文件各项详细信息
其中,主窗体负责调用其它三个窗体,窗体之间通过委托和事件进行信息传递。
## 4.1 GUI说明
### 4.1.1 主窗口
![](http://www.writebug.com/myres/static/uploads/2021/10/19/27bc4c5d90cc8ff4e8c45ecb1b9ddd31.writebug)
其中,蓝色标识的文件是目录文件,黑色标识的是普通文件,红色标识的是未知文件。未知文件一般不会出现,除非磁盘映像损坏造成错误。我们可以尝试一下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/1b1bc76ed8f340efb1c0a9c60e345fb3.writebug)
重新运行文件管理系统,可以看到:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/ff73b87c73da0c3dbe3a7a8f9afbae4c.writebug)
目录文件`斗破苍穹`已被损坏,成为了未知文件。保存此时的磁盘映像,可以看到:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f0a42d425a4e958cc59bb4f00f28f541.writebug)
文件类型已经发生了改变。
### 4.1.2 输入窗口
这个窗口主要用于进行命名操作,以及在格式化时输入磁盘大小。
**重命名**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/3b0b4f6dce285a8eb70e455e8b3e6bf4.writebug)
点击确定或按下回车键,文件名变为:![](http://www.writebug.com/myres/static/uploads/2021/10/19/6b5595709483cc055f3fa1d5091414e1.writebug)
**新建文件**
也可以尝试新建目录和文件,并为它们命名:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/b1ad2f01639404f890877784f57038e5.writebug)
**格式化**
在进行格式化时,务必注意输入的数字符合要求,否则无法进行格式化:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/61fe3f98d1ef46cfa12138d2cbb107c8.writebug)
磁盘空间大小必须为大于0小于等于100的整数。
### 4.1.3 文件查看和编辑窗口
首先,只有普通类型的文件可以被“打开”,目录文件和未知文件无法执行“打开”操作。
“打开”文件分为两种类型:只读和读写模式。只读模式下,用户将无法对文件内容进行编辑,而读写模式下则可以。
双击文件或按下回车键采用的是只读模式打开,编辑文件需要点击`写文件`按钮或按下W键。
**只读模式**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c57fac42f8eb20ce1c3d0a4e5ecd0a11.writebug)
用户无法编辑文件内容,`确认`按钮也没有被激活。
**读写模式**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/61f0db0ea78cadcf4ea8fe8bcdbd1973.writebug)
用户可以对文件进行编辑,编辑之后可以点击`确认`按钮或同时按下Control+S键保存修改的内容,也可以点击`取消`按钮或者右上角的叉号或者按下Esc键放弃更改。
### 4.1.4 文件详情窗口
当用户选中一个文件时,按下空格键可以查看其详细信息。操作时应当注意,当窗口焦点位于某一按钮时,即使文件看起来被选中了,此时按下空格键也无法看到文件详情。
**普通文件详情**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/093d870eab367eec3520ca38fba794f7.writebug)
**目录文件详情**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6ceaa6778136f47f13c5baf12b079a31.writebug)
当然,目录文件详情中的文件大小是指目录文件本身的大小,不包含目录文件的子文件。
在详情界面,再次按下空格键即可关闭详情页。
## 4.2 使用说明
| 主界面操作 | 效果 |
| :---------------: | :-------: |
| 双击普通文件 | 以只读模式打开文件 |
| 双击目录 | 进入该目录 |
| 按F键 | 格式化磁盘 |
| 按N键 | 新建普通文件 |
| 选中普通文件,按回车键 | 以只读模式打开文件 |
| 选中普通文件,按W键 | 以读写模式打开文件 |
| 按退格键(Backspace) | 返回上一级目录 |
| 选中目录,按回车键 | 进入该目录 |
| 按D键 | 创建目录 |
| 选中文件,按删除键(Delete) | 删除文件 |
| 选中文件,按R键 | 重命名 |
| 按Control+W键 | 退出系统,保存映像 |
| 选中文件,按空格键 | 查看文件详情 |
| 文件编辑页面操作 | 效果 |
| :---------: | :--------: |
| 按退出键(Esc) | 关闭窗口,不保存修改 |
| 按Control+S键 | 关闭窗口,保存修改 |
注:只读模式打开的文件无法使用Control+S按键关闭窗口
| 文件详情页面操作 | 效果 |
| :------: | :----: |
| 按空格键 | 关闭详情页面 |
| 输入窗口页面操作 | 效果 |
| :---------: | :--------: |
| 按退出键(Esc) | 关闭窗口,输入不生效 |
| 按回车键(Enter) | 关闭窗口,�