实现了简单的文件系统的操作。
没有实现磁盘块之间的连接,目录与磁盘属于一对一链接,没法指定磁盘块存放并且文件内容超出磁盘块就无法存储了。
#include<iostream>
#include<string>
using namespace std;
const int MaxsizeOfIndex = 10; //目录的大小
const int MaxsizeOfDiskBlock = 2000; //磁盘块的大小
//磁盘
typedef struct Disk {
char disk[MaxsizeOfDiskBlock]; //磁盘块中存储的内容
};
//目录
typedef struct Index{
int empty; //当前目录是否有文件
char name[10]; //文件名
};
Disk d[MaxsizeOfIndex]; //磁盘块号
Index f[MaxsizeOfIndex]; //目录
//函数的声明
void create();
void Delete();
void open();
void write();
void write_add();
void delete_content();
void show_file_system();
int main() {
int op_type; //操作种类
//文件系统初始化,全部标记为未使用
for (int i = 0; i < MaxsizeOfIndex; i++) {
f[i].empty = 0;
}
//文件系统操作
while (1) {
cout << "1.创建文件" << " 2.删除文件" << " 3.读文件" << " 4.写入文件" << " 5.添加文件内容" <<" 6.删除文件内容" <<" 7.结束" << endl;
cout << "请输入:";
cin >> op_type; //输入操作码
switch (op_type)
{
case 1:create(); break;
case 2:Delete(); break;
case 3:open(); break;
case 4:write(); break;
case 5:write_add(); break;
case 6:delete_content(); break;
default:
break;
}
if (op_type == 7)
break;
show_file_system();
}
return 0;
}
//创建文件(创建索引)
void create() {
int state = 0; //标记是否正常创建文件,后面所有state均为标记,标记功能是否正常运行
char write_state = 'N'; //写入标记,创建完文件询问是否需要直接写入
char Delete_state = 'N'; //删除标记,空间不足,询问是否删除
for (int i = 0; i < MaxsizeOfIndex; i++) {
if (f[i].empty == 0) { //找到空区域
f[i].empty = 1; //标记为已用
cout << "请输入文件名:"; //输入想要创建的文件的名称
cin >> f[i].name;
state = 1; //标记为正常创建
cout << "是否要输入文件内容(Y/N):"; //询问创建之后要不要输入
cin >> write_state;
if (write_state == 'Y') {
cout << "请输入文件内容:"; //为了不用重复输入文件名,这里没有调用write(),感觉可以使用同名函数
cin >> d[i].disk;
}
break;
}
}
if (state == 0) { //没有空区域,询问是否删除
cout << "没有剩余空间,删除文件(Y/N):";
cin >> Delete_state;
if (Delete_state == 'Y') {
Delete();
}
}
}
//删除文件(删除索引)
void Delete() { //将此处标记为空,删除索引,不用删除内容
char name[10];
int state = 0;
char Delete_state;
cout << "请输入想删除的文件名:"; //输入需要删除的文件名
cin >> name;
for (int i = 0; i < MaxsizeOfIndex; i++) {
if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) { //找到同名文件,且块为占用块
f[i].empty = 0; //标记为空
cout << "删除成功" << endl;
state = 1; //标记正常删除文件索引
break;
}
}
if (state == 0) { //未正常删除
cout << "删除失败,请输入正确的文件名,重新输入(Y/N): ";
cin >> Delete_state;
if (Delete_state == 'Y') {
Delete();
}
}
}
//打开文件
void open() {
char name[10];
char write_state;
char empty_cmp[2000] = { '\0' };
cout << "请输入文件名要打开的:"; //输入想要打开的文件名
cin >> name;
for (int i = 0; i < MaxsizeOfIndex; i++) {
if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) { //名字相同,且块不为空,因为删除的时候,不会删除其中的名字,只是标记为空
if (strcmp(d[i].disk, empty_cmp) == 0) { //块内无内容,询问要不要先写入
cout << "文件内容为空,请先写入文件,写入(Y/N):"<<endl;
cin >> write_state;
if (write_state == 'Y') {
write();
}
}
else { //块内有内容,直接读出
cout << "文件内容为:" << endl;
cout << d[i].disk << endl;
}
break;
}
}
}
//写入文件
void write() {
char name[10];
int state = 0;
char write_state = 'N';
cout << "请输入文件名:";
cin >> name;
for (int i = 0; i < MaxsizeOfIndex; i++) {
if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) { //找到已经建立索引的文件
cout << "请输入文件内容:";
cin >> d[i].disk; //将内容写入到对应的磁盘块中
state = 1; //标记为正常写入
break;
}
}
if (state == 0) { //写入失败
cout << "写入失败,请输入正确的文件名,重新输入(Y/N): ";
cin >> write_state;
if (write_state == 'Y') {
write();
}
}
}
//添加文件内容
void write_add() { //在文件最后添加内容
char content[100];
char name[10];
int char_site;
int size;
cout << "请输入想操作的文件:";
cin >> name;
cout << "想要添入的内容:";
cin >> content;
cout << "请输入想添加到的位置:";
cin >> char_site;
for (int i = 0; i < MaxsizeOfIndex; i++) {
if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) {
int temp = i;
for (int i = sizeof(d[temp].disk)-1; i > char_site ; i--) { //向后挪出空间
d[temp].disk[i + strlen(content)] = d[temp].disk[i];
}
for (int i = 0; i < strlen(content); i++) { //这里不能使用sizeof,因为sizeof包括了最后的'\0',会导致输出认为到这里就结束了
d[temp].disk[i + char_site] = content[i];
}
}
}
cout << "写入成功";
}
//删除文件内容
void delete_content() {
char name[10];
int state = 0;
char Delete_state = 'N';
cout << "请输入想要删除的文件内容的文件名:";
cin >> name;
for (int i = 0; i < MaxsizeOfIndex; i++) {
if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) {
memset(d[i].disk, '\0', sizeof(d[i].disk)); //把磁盘块设置为空
cout << "删除完成"; //正常删除
state = 1;
break;
}
}
if (state == 0) { //删除失败
cout << "删除失败,请输入正确的文件名,重新输入(Y/N): "<<endl;
cin >> Delete_state;
if (Delete_state == 'Y') {
delete_content();
}
}
}
void show_file_system() {
int state = 0;
cout << "文件号" << " " << "文件名" <<endl;
for (int i = 0; i < MaxsizeOfIndex; i++) {
if (f[i].empty == 1) {
state = 1;
cout << i + 1 << " " << f[i].name << endl;
}
}
if (state == 0) {
cout << "无文件" << endl;
}
}