# 基于C++的类UNIX文件系统
# 一、题目要求
使用一个普通的大文件(如 c:\\myDisk.img ,称之为一级文件)模拟 UNIX V6++的一个文件卷,一个文件卷实际上就是一张逻辑磁盘,磁盘中存储的信息以块为单位。每块 512字节。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/521d8d4a5a59b9782375d8392796cb49.writebug)
- 磁盘文件结构
- 定义自己的磁盘文件结构
- SuperBlock 结构
- 磁盘 Inode 节点结构,包括:索引结构及逻辑块号到物理块号的映射
- 磁盘 Inode 节点的分配与回收算法设计与实现
- 文件数据区的分配与回收算法设计与实现
- 文件目录结构
- 目录文件结构
- 目录检索算法的设计与实现
- 文件打开结构:选作
- 磁盘高速缓存:选作
- 文件操作接口
```C
• void fformat(); 格式化文件卷
• void ls(); 列目录
• int fopen(char *name, int mode); 打开文件
• void fclose(int fd); 关闭文件
• int fread(int fd, char *buffer, int length); 读文件
• int fwrite(int fd, char *buffer, int length);写文件
• int flseek(int fd, int position); 定位文件读写指针
• int fcreat(char *name, int mode); 新建文件
• int fdelete(char *name); 删除文件
```
- 主程序
- 初始化文件卷,读入 SuperBlock
- 图形界面或者命令行方式,等待用户输入
- 根据用户不同的输入,返回结果
# 二、需求分析
根据对题目要求分析和用户使用分析,文件系统采用控制台命令作为输入,按照系统给定的命令即可完成相应的功能。
控制台的命令应包括如下:
```C
" man : 手册 \n"
" fformat : 格式化 \n"
" exit : 正确退出 \n"
" mkdir : 新建目录 \n"
" cd : 改变目录 \n"
" ls : 列出目录及文件 \n"
" create : 新建文件 \n"
" delete : 删除文件 \n"
" open : 打开文件 \n"
" close : 关闭文件 \n"
" seek : 移动读写指针 \n"
" write : 写入文件 \n"
" read : 读取文件 \n"
" at|autoTest : 自动测试 \n"
```
每条命令具体分析如下:
```C
命令:fformat =
"Command : fformat -进行文件系统格式化 \n"
"Description : 将整个文件系统进行格式化,即清空所有文件及目录! \n"
"Usage : fformat \n"
"Parameter : 无 \n"
"Usage Demo : fformat \n"
;
```
```C
命令:exit =
"Command : exit -退出文件系统 \n"
"Description : 若要退出程序,最好通过exit命令。此时正常退出会调用析构函数,\n"
" : 若有在内存中未更新到磁盘上的缓存会及时更新,保证正确性。若点 \n"
" : 击窗口关闭按钮,属于给当前程序发信号强制退出,不会调用析构函 \n"
" : 数,未写回部分信息,再次启动时可能出现错误! \n"
"Usage : exit \n"
"Parameter : 无 \n"
"Usage Demo : exit \n"
;
```
```C
命令:mkdir =
"Command : mkdir -建立目录 \n"
"Description : 新建一个目录。若出现错误,会有相应错误提示! \n"
"Usage : mkdir <目录名> \n"
"Parameter : <目录名> 可以是相对路径,也可以是绝对路径 \n"
"Usage Demo : mkdir dirName \n"
" mkdir ../dirName \n"
" mkdir ../../dirName \n"
" mkdir /dirName \n"
" mkdir /dir1/dirName \n"
"Error Avoided : 目录名过长,目录路径不存在,目录超出根目录等 \n"
;
```
```C
命令:ls =
"Command : ls -列目录内容 \n"
"Description : 列出当前目录中包含的文件名或目录名。若出现错误,会有相应错误提示!\n"
"Usage : ls \n"
"Parameter : 无 \n"
"Usage Demo : ls \n"
;
```
```C
命令:cd =
"Command : cd -改变当前目录 \n"
"Description : 改变当前工作目录。若出现错误,会有相应错误提示! \n"
"Usage : cd <目录名> \n"
"Parameter : <目录名>默认为当前目录;\n"
" <目录名> 可以是相对路径,也可以是绝对路径 \n"
"Usage Demo : ls \n"
" ls ../dirName \n"
" ls ../../dirName \n"
" ls /dirName \n"
" ls /dir1/dirName \n"
"Error Avoided : 目录名过长,目录路径不存在,目录超出根目录等 \n"
;
```
```C
命令:create =
"Command : create -新建文件 \n"
"Description : 新建一个文件。若出现错误,会有相应错误提示! \n"
"Usage : create <文件名> <选项> \n"
"Parameter : <文件名> 可以包含相对路径或绝对路径 \n"
" <选项> -r 只读属性 \n"
" <选项> -w 只写属性 \n"
" <选项> -rw == -r -w 读写属性 \n"
"Usage Demo : create newFileName -rw \n"
" create ../newFileName -rw \n"
" create ../../newFileName -rw \n"
" create /newFileName -rw \n"
" create /dir1/newFileName -rw \n"
"Error Avoided : 文件名过长,目录路径不存在,目录超出根目录等 \n"
;
```
```C
命令:delet =
"Command : delete -删除文件 \n"
"Description : 删除一个文件。若出现错误,会有相应错误提示! \n"
"Usage : delete <文件名> \n"
"Parameter : <文件名> 可以包含相对路径或绝对路径 \n"
"Usage Demo : delete fileName \n"
" delete ../fileName \n"
" delete ../../fileName \n"
" delete /fileName \n"
" delete /dir1/fileName \n"
"Error Avoided : 文件名过长,目录路径不存在,目录超出根目录等 \n"
;
```
```C
命令:open =
"Command : open -打开文件 \n"
"Description : 类Unix|Linux函数open,打开一个文件。若要进行文件的读写必须先open。\n"
" 若出现错误,会有相应错误提示! \n"
"Usage : open <文件名> <选项> \n"
"Parameter : <文件名> 可以包含相对路径或绝对路径 \n"
" <选项> -r 只读属性 \n"
" <选项> -w 只写属性 \n"
" <选项> -rw == -r -w 读写属性 \n"
"Usage Demo : open fileName -r \n"
" open ../fileName -w \n"
" open ../../fileName -rw \n"
" open /fileName -r -w \n"
" open /dir1/fileName -rw \n"
"Error Avoided : 文件名过长,目录路径不存在,目录超出根目录等 \n"
;
```
```C
命令:close =
"Command : close -关闭文件 \n"
"Description : 类Unix|Linux函数close,关闭一个文件。可以对已经打开的文件进行关闭\n"
" 若出现错误,会有相应错误提示! \n"
"Usage : close <file descriptor> \n"
"Parameter : <file descriptor> 文件描述符 \n"
"Usage Demo : close 1 \n"
"Error Avoided : 文件描述符不存在或超出范围 \n"
;
```
```C
命令:seek =
"Command : seek -写入文件 \n"
"Description : 类Unix|Linux函数fseek,写入一个已经打开的文件中。若出现错误,会有相应错误提示! \n"
"Usage : seek <file descriptor> <offset> <origin> \n"
"Parameter : <file descriptor> open返回的文件描述符 \n"
" <offset> 指定从 <origin> 开始的偏移量 可正可负 \n"
" <origin> 指定起始位置 可为0(SEEK_SET), 1(SEEK_CUR), 2(SEEK_END) \n"
"Usage Demo : seek 1 500 0 \n"
"Error Avoided : 文件描述符不存在或超出范围,未正确指定参数 \n"
;
```
```C
命令:write =
"Command : write -写入文件 \n"
"Description : 类Unix|Linux函数write,写入一个已经打开的文件中。若出现错误,会有相应错误提示! \n"
"Usage : write <file descriptor> <InFileName> <size> \n"
"Parameter : <file descriptor> open返回的文件描述符 \n"
" <InFileName> 指定写入内容为文件InFileName中的内容 \n"
" <size> 指定写入字节数,大小为 <size> \n"
"Usage Demo : write 1 InFileName 123 \n"
"Error Avoided : 文件描述符不存在或超出范围,未正确指定参数 \n"
;
```
```C
命令:read =
"Command : read -读取文件 \n"
"Description : 类Unix|Linux函数read,从一个已经打开的文件中读取。若出现错误,会有相应错误提示! \n"
"Usage : read <file descriptor> [-o <OutFileName>] <size> \n"
"Parameter : <file descriptor> open返回的文件描述符 \n"
" [-o <OutFileName>] -o 指定输出方式为文件,文件名为 <OutFileName> 默认为shell \n"
" <size> 指定读取字节数,大小为 <size> \n"
"Usage Demo : read 1 -