操作系统文件管理实验代码

实现了简单的文件系统的操作。
没有实现磁盘块之间的连接,目录与磁盘属于一对一链接,没法指定磁盘块存放并且文件内容超出磁盘块就无法存储了。

#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;
	}
}
  • 17
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
操作系统文件管理实验代码和效果因不同的实验要求和语言而异,下面为您提供一个示例: 文件管理实验要求: 使用 C 语言实现一个简单的文件管理系统,具有以下功能: 1. 创建文件 2. 删除文件 3. 打开文件 4. 关闭文件 5. 读取文件内容 6. 写入文件内容 文件管理实验代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_FILE_NUM 100 // 最大文件数 // 文件结构体 typedef struct { char filename[20]; // 文件名 int flag; // 文件状态:0-未使用,1-已使用 char content[100]; // 文件内容 } File; int file_num = 0; // 文件数量 File files[MAX_FILE_NUM]; // 文件数组 // 创建文件 void create_file(char *filename) { if (file_num >= MAX_FILE_NUM) { printf("文件数量已达到最大值\n"); return; } for (int i = 0; i < file_num; i++) { if (strcmp(files[i].filename, filename) == 0) { printf("文件名已存在\n"); return; } } strcpy(files[file_num].filename, filename); files[file_num].flag = 1; file_num++; printf("文件创建成功\n"); } // 删除文件 void delete_file(char *filename) { for (int i = 0; i < file_num; i++) { if (strcmp(files[i].filename, filename) == 0) { files[i].flag = 0; printf("文件删除成功\n"); return; } } printf("文件不存在\n"); } // 打开文件 int open_file(char *filename) { for (int i = 0; i < file_num; i++) { if (strcmp(files[i].filename, filename) == 0) { if (files[i].flag == 1) { printf("文件打开成功\n"); return i; } else { printf("文件已被占用\n"); return -1; } } } printf("文件不存在\n"); return -1; } // 关闭文件 void close_file(int index) { if (index >= 0 && index < file_num) { files[index].flag = 1; printf("文件关闭成功\n"); } else { printf("文件不存在\n"); } } // 读取文件内容 void read_file(int index) { if (index >= 0 && index < file_num) { printf("文件内容:%s\n", files[index].content); } else { printf("文件不存在\n"); } } // 写入文件内容 void write_file(int index, char *content) { if (index >= 0 && index < file_num) { strcpy(files[index].content, content); printf("文件写入成功\n"); } else { printf("文件不存在\n"); } } int main() { create_file("test.txt"); int index = open_file("test.txt"); write_file(index, "Hello, world!"); read_file(index); close_file(index); delete_file("test.txt"); return 0; } ``` 文件管理实验效果: ``` 文件创建成功 文件打开成功 文件写入成功 文件内容:Hello, world! 文件关闭成功 文件删除成功 ``` 以上代码为一个简单的文件管理系统,实现了创建、删除、打开、关闭、读取和写入文件的功能。您可以根据具体的实验要求和语言进行修改和完善。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值