这里写自定义目录标题
操作系统实验五 文件系统
实验要求
本实验要求在模拟的I/O系统之上开发一个简单的文件系统。
用户通过create, open, read等命令与文件系统交互。
文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0至L − 1。I/O系统利用内存中的数组模拟磁盘。
Task1 概要设计
定义文件系统时,我们首先需要对存储文件的磁盘进行划分,主要分为两大部分:
数据区: 存放文件的具体数据
保留区: 用于实现位图区和文件描述区
我们使用文件记录区,存储当前文件的名字是用户可见的,可以利用其得到我们文件的位图0-1矩阵。
Inode table 主要存储文件的地址存放信息,可以对应到数据区中进行存储和读取。
这里必须明确,文件记录区和inode table也是磁盘的一部分
数据区也就是我们的磁盘最主要的部分,用于存储文件数据。
实现如下内容
1.三个虚拟分区对应的数据结构
2.设计每个文件的数据结构
3.文件存储和磁盘的存储关系函数
4.对应的create函数等
5.文件打开记录表的实现
6.用户实现界面
Task2 数据结构
对块的数据结构进行定义,对于磁盘主要定义用来存储数据的data数组,模拟扇区512byte的数据区
typedef struct MyBlock
{
char data[512]; //对应扇区的字节
char flag; //是否存储
MyBlock* next;
}myblock;
对文件的基础信息进行定义,主要包含4项,包括文件名称,创建时间,和修改时间,其中content代表正文存储的块地址。
typedef struct File //文件结构体
{
char* name; //文件命名
char* time; //创建时间
char* changeTime; //修改时间
myblock* content;
}file;
打开文件链表
typedef struct OpenFile
{
int index;
int pos;
myblock* data;
}openFile;
Task 3 交互
Task4 初始化和修改
4.1 Create
1.查看文件名是否存在非法字符
2.查看位图,查看是否重名
3.查看位图,寻找对应空的位置块
4.申请磁盘空间,存储文件的data
int create(char* filename)// 根据指定的文件名创建新文件。
{
file newfile;
newfile.name = filename;
//命名是否含有非法字符
for (int i = 0; i < 8; i++)
{
if (strchr(filename, error[i][0]))
{
cout << "Error: Illegal letters" << endl;
break;
}
}
int temp = 1;
int pos = 0;
// 是否命名重复
for (int i = 0; i < B_MAX; i++)
{
if (ldisk[0][0][i].flag == '1')
{
if (strcmp(ldisk[0][0][i].data,filename)==0)
{
temp = 0;
break;
}
}
else