# OSvirtualDisk
**Repository Path**: UndeadCore/OSvirtualDisk
## Basic Information
- **Project Name**: OSvirtualDisk
- **Description**: 操作系统大作业
- **Primary Language**: C++
- **License**: CC0-1.0
- **Default Branch**: major
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-06-01
- **Last Updated**: 2024-06-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OSvirtualDisk
操作系统大作业:基于磁盘块链的文件系统实现

本作品可采用知识共享署名 4.0 国际许可协议进行许可。
本作品可采用GPLv3进行许可。
## 1.文件系统组织方式:
#### ·使用磁盘块为基础单位,一个虚拟磁盘含有两种类型的磁盘块。
#### ·对于目录树和文件,统一采用磁盘块链的方式储存。
#### ·对于每一个磁盘块,有块头部份(24B)和块内容部分(1000B)。
#### ·其中块头部份储存了本块的类型:{目录块,文件块},前一个块的位置,后一个块的位置;
### 1.1.目录块
#### ·目录块是磁盘目录树在磁盘的存储形式,每一个目录块包含25条记录:
#### ·每一条记录表示一个文件或者目录,其属性为:{父目录,文件/目录名称,文件的第一个文件块位置(如果不是是文件则为-1)}
#### ·通过广度优先算法将内存中的目录树转换为 vector<记录>,以25个为单位,拆分到目录块链中。
#### ·通过生成树算法将记录还原为内存中的目录树
### 1.2.文件块
#### ·每一个文件记录都会对应的分配至少一个文件块,文件内容以块链形式储存。
#### ·文件快的内容部分用于储存文件的内容
## 2.虚拟磁盘类
### 2.1 数据成员:
#### ·1个fstream对象,用于操作虚拟磁盘的文件内容
#### ·最小编号可用快,用于为writeIndex/writeBlock找不到下一个磁盘快时分配下一个磁盘块
#### ·\*blockStatus,用于记录磁盘所有块的使用状态
### 2.1 成员函数:
虚拟磁盘的成员函数直接为DOS类的增删改查服务
#### 基础操作:writeBlock(BlockNum),readBlock(BlockNum),clearBlocks(firstBlockNum)
#### 目录操作:writeIndex(firstBlockNum,indexList),readIndex(firstBlockNum)
#### 文件操作:writeFile(firstBlockNum,fileContent),readFile(firstBlockNum)
## 3.DOS类
负责将解析后的用户命令转换为对虚拟磁盘的查询,更改
#### ·string fullPath();返回当前目录全路径名称
#### ·int ls();列出当前目录下所有文件和目录
#### ·int help(string command="");打印命令说明
#### ·int cd(string);更改当前操作目录
#### ·int mkdir(string);创建文件夹
#### ·int rm(string);递归删除文件夹,删除文件
#### ·int cat_r(string);读文件
#### ·int cat_w(string, vector & ); 写文件(覆盖)
#### ·int cat_a(string, vector & ); 写文件(尾部增加)
## 4.主函数命令解析
#### ·通过getline()读入一行命令,以空格为分隔符解析到vector数组中。
#### ·解析命令,调用对应DOS函数