操作系统文件管理

文件管理

1.实验目的

1.用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2.要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。

2.实验内容与要求

设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
1.程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED);另外,为打开文件设置了运行文件目录(AFD)。
2.为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作
3.算法与框图:
因系统小,文件目录的检索使用了简单的线性搜索。文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。
程序中使用的主要设计结构如下:
主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)
在这里插入图片描述

3.流程图与模块调用

在这里插入图片描述

4.实验分析

本次实验实现的是,操作系统对磁盘中文件管理的一些操作,对文件管理采用二级文件目录。在操作之前,首先要定义三个结构体,其中包括:
1. MFD目录
主要包括用户名和文件目录指针,用来指向该用户所存文件的存储位置;
2. UFD目录
主要包括文件名、保护码和文件长度,表示具体的某个文件;
3. AFD目录
主要包括打开文件名、打开保护码和读写指针,表示对于当前用户已打开的文件记录;
实验内容为:

  1. 创建一个新文件
  2. 删除文件
  3. 打开文件
  4. 关闭文件
  5. 读入文件
  6. 写入文件

在实现整个文件管理的过程中,建议结合平时是如何对一个文件进行操作的,来实现整个代码内容,在完成实验中,主要是模拟整个文件管理逻辑,无法真正的对文件操作,比如在读入文件时,只需要在当前已打开的文件中,找到要写入的文件,然后对其服状态“正在写入”,表示正在写入操作,即完成写入文件的内容,因为整个实验的目的是为了模拟,无法真正的表示写入该文件。

5.运行情况

在这里插入图片描述

6.实验体会

在完成整个实验后,结合平常对文件的各种操作,能够理解操作系统在实现文件管理时,背后进行的一系列操作,整个文件管理相比于其他实验,给我更深刻的体会是,算法的逻辑相对少一点,但是要实现的功能和存储的信息要多出很多,这也是操作系统在设计时需要考虑的一件事,合理存储这些记录信息,以便用户在操作时有更好的交互性。

代码

#include<iostream>
#include<vector>
using namespace std;

struct UFD
{
	string filename;//文件名
	string protect;//保护码
	int length;//文件长度
};
struct MFD
{
	string user;//用户名
	vector<UFD> ip;//文件目录指针
};
struct AFD
{
	string open_file;//打开文件名
	string open_protect;//打开保护码
	string read_write;//读写指针
};
//vector<UFD> file;
vector<MFD> use(10);
vector<AFD> open;//当前打开
void print(char s)
{
	int p = s - 'A';
	if (use[p].ip.size() == 0)
	{
		cout << "该用户还没有文件" << endl;
	}
	else
	{
		for (int i = 0; i < use[p].ip.size(); i++)
		{
			cout << "文件名: " << use[p].ip[i].filename << " 保护码: " << use[p].ip[i].protect << " 文件长度: " << use[p].ip[i].length << endl;
		}
	}
}
void deletef(char s, string na)//删除文件
{
	for (int i = 0; i < use[s - 'A'].ip.size(); i++)
	{
		if (na == use[s - 'A'].ip[i].filename)
		{
			use[s - 'A'].ip.erase(use[s - 'A'].ip.begin()+i);//删除
			return;
		}
	}
	cout << "未找到删除的文件" << endl;
}
void creatf(char s,string na,string pro,int len)//创造新文件
{
	UFD q;
	q.filename = na;
	q.length = len;
	q.protect = pro;
	if(use[s-'A'].ip.size()<10)
		use[s - 'A'].ip.push_back(q);
	else
	{
		cout << "所拥有文件已满" << endl;
	}
}
void openf(char s,string na)//打开文件
{
	if (open.size() >= 5)
	{
		cout << "打开文件个数已到上限" << endl;
		return;
	}
	for (int i = 0; i < use[s - 'A'].ip.size(); i++)
	{
		if (na == use[s - 'A'].ip[i].filename)
		{
			AFD q;
			q.open_file = na;
			q.open_protect = use[s - 'A'].ip[i].protect;
			q.read_write = "close";
			open.push_back(q);
			cout << "打开文件名: " << q.open_file << " 打开文件保护码: " << q.open_protect << " 读写指针: " << q.read_write << endl;
		}
	}
}
void closef( string na)//关闭
{
	for (int i = 0; i < open.size(); i++)
	{
		if (open[i].open_file == na)
		{
			open.erase(open.begin() + i);
			break;
		}
	}
}
void readf(string na)//读取文件
{
	for (int i = 0; i < open.size(); i++)
	{
		if (open[i].open_file == na)
		{
			open[i].read_write = "reading";
			break;
		}
	}
}
void writef(string na)//写入文件
{
	for (int i = 0; i < open.size(); i++)
	{
		if (open[i].open_file == na)
		{
			open[i].read_write = "writing";
			break;
		}
	}
}
int main()
{
	cout << "共有10位用户可选:" << endl;
	for (int i = 0; i < 10; i++)
	{
		/*string ee;
		string lo ;
		lo = '0' + i;
		ee = "use" + lo;*/
		use[i].user = 'A'+ i;
		cout << use[i].user << " ";
	}
	cout << endl;
	cout << "请输入用户名" << endl;
	char wg;
	cin >> wg;
	print(wg);
	cout << "请输入指令:" << endl;
	cout << "1:创建新文件  2:删除文件" << endl << "3:打开文件  4:关闭文件" << endl << "5:读出文件  6:写入文件" << endl << "7:查看文件目录  8:退出" << endl;
	int hlp;
	cin >> hlp;
	while (hlp != 8)
	{
		if (hlp == 1)
		{
			string name;//文件名
			string p = "11";//保护码默认可读可写
			int leng;//长度
			cout << "请输入文件名、长度" << endl;
			cin >> name >> leng;
			creatf(wg, name, p, leng);
		//	cout << "创建成功" << endl;
		}
		else if (hlp == 2)
		{
			string name;
			cout << "请输入你要删除的文件名" << endl;
			cin >> name;
			deletef(wg, name);
			cout << "删除成功" << endl;
		}
		else if (hlp == 3)
		{
			string name;
			cout << "请输入你要打开的文件名" << endl;
			cin >> name;
			openf(wg, name);
			cout << "打开成功" << endl;
		}
		else if (hlp == 4)
		{
			string name;
			cout << "请输入你要关闭的文件名" << endl;
			cin >> name;
			closef(name);
			cout << "关闭成功" << endl;
		}
		else if (hlp == 5)
		{
			string name;
			cout << "请输入你要读取的文件名" << endl;
			cin >> name;
			readf(name);
			cout << "读取成功" << endl;
		}
		else if (hlp == 6)
		{
			string name;
			cout << "请输入你要写入的文件名" << endl;
			cin >> name;
			writef(name);
			cout << "写入成功" << endl;
		}
		else if (hlp == 7)
		{
			print(wg);
		}
		cout << "请输入指令" << endl;
		cin >> hlp;
	}
}

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值