操作系统:文件管理

(一)实验目的

         通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。

(二)实验内容及要求

设计一个简单的二级文件系统。要求做到以下几点:

(1)可以实现下列几条命令(至少4条);

   login     用户登陆

   dir     列文件目录

   create 创建文件

   delete 删除文件

   open     打开文件

   close     关闭文件

   read     读文件

   write     写文件

(2)列目录时要列出文件名、物理地址、保护码和文件长度;

(3)源文件可以进行读写保护。

(三)实现的功能有以下几个模块

功能模块:

  1. 创建文件
  2. 删除文件
  3. 写文件
  4. 读文件
  5. 创建目录
  6. 删除目录
  7. 打开目录
  8. 返回上一层目录
  9. 查看当前目录
  10. 修改密码
  11. 安全退出

(四)代码

#include<string>
#include<stdlib.h>
#include<iomanip>
#include<iostream>
using namespace std;

#if _MSC_VER>1000
#pragma once
#endif	//_MSC_VER>1000


extern int disk_block[10000];
extern int disk_empty;
typedef struct UFD		//存储文件信息
{
	char name[10];		//文件名
	int attribute;		//属性
	int length;			//长度
	string str;//存放的字符串;
	int a[10];		//为文件本身分配10个空间
	int* p1;			//一级索引,100个空间
	int(*p2)[100];		//二级索引,100*100个空间
	struct UFD* next;
}UFD;
typedef struct DIR		//存储目录信息
{
	DIR* above;			//上一结点
	char name[10];
	int length;
	DIR* next;			//下一结点
	UFD* File_head;		//此目录下的文件指针
	DIR* Dir_head;		//此目录下目录链表指针
}DIR;

class Cuse				//定义管理用户目录的类
{
	DIR* now;			//当前目录
	UFD* Fhead;			//文件的头结点
	DIR* Dhead;			//根目录的目录链头结点
	char code[10];		//密码
	char name[10];		//用户名
	int length;			//用户空间大小
	int status;			//是否获得空间
public:
	int write();
	void set_status(int);
	int dele_user();
	int dis_file();		//显示文件所占外存块号
	int dis_dir(DIR* d);//当前路径
	int get_length();
	char const* get_name();
	char const* get_code();
	int get_status();
	int set_user(char*, char*);//设置用户名与密码
	DIR* get_now();
	int dele_file(UFD* f);		//删除文件
	int dele_dir(DIR*);			//删除目录
	Cuse();						//构造
	~Cuse();					//析构
	int goback();				//返回上级
	int dis_now();				//显示当前目录
	int new_file();
	int new_dir();
	int open_dir();
	int open_file();
	int first_dele_file();		//删除文件的前部分工作
	int first_dele_dir();		//删除目录的前部分工作
	int set_code();
};

class Cdisk {					//用户类
public:
	Cuse user[5];		//用户个数最多为5
	char code[10];
	int dis_disk();
	int first_dele_user();
	int dele_user(int);
	int new_user();				//查看当前用户与外存空间使用情况,后创建新用户
	int set_code();				//设置新密码
	int login(char);				//登陆
	Cdisk();
	virtual~Cdisk();			//虚函数,析构
};

int disk_block[10000];
int disk_empty;
Cdisk::Cdisk()		//管理磁盘的类,构造函数
{
	int i = 0;
	char code[10] = "123456";
	for (i = 0; i < 10000; i++)		//初始化所有磁盘块为空闲
		disk_block[i] = 0;
	//this->user[0].set_user("student","123");//默认一个用户
	disk_empty = 10000;
	cout.setf(ios::left);	//设置输出方式
}
Cdisk::~Cdisk()		//析构
{
}

int Cdisk::dele_user(int i)		//Cdisk类dele_user的构造
{
	Cuse C;
	C = user[i];
	user[i].dele_user();		//调用Cuse类的成员函数 int dele_user()
	return 1;
}

int Cdisk::dis_disk()		//检查磁盘信息
{
	int i = 0;
	cout << setw(14) << "用户名" << setw(14) << "占用空间大小" << endl;
	for (i = 0; i < 5; i++)
		if (user[i].get_status() == 1)		//存在的用户的信息
			cout << setw(14) << user[i].get_name() << setw(14) << user[i].get_length() << endl;
	cout << "已用空间:" << 10000 - disk_empty << endl << "剩余空间:" << disk_empty << endl;
	return 1;
}
int Cdisk::login(char b)		//登陆
{
	char n[10], c[10];
	int i;
	if (b == '1')
	{
		cout << "用户:管理员" << endl;
		cout << "密码:默认\n" << endl;
		system("pause");
		return 1;
	}
	else
	{
		if (!user[0].get_status())	//当前不存在用户
		{
			i = 0;
			cout << "当前用户为空,欢迎注册!" << endl;
			user[i].set_status(1);		//为新用户分配权利
			cout << "请输入用户名:" << endl;
			cin >> n;
			cout << "请输入密码:" << endl;
			cin >> c;
			user[i].set_user(n, c);		//调用Cuse的成员函数,传递用户名与密码

			cout << "恭喜,创建用户成功!" << endl;
			return i;
		}
		else
		{
			cout << "用户名:";
			cin >> n;
			cout << "密码:";
			cin >> c;
			cout << endl;
			for (i = 0; i < 5; i++)	//查找是否存在此用户
			{
				if (user[i].get_status())		//存在方比较
					if (!strcmp(n, user[i].get_name()))	//相等时为0,此判断为匹配
						if (!strcmp(c, user[i].get_code()))		//密码匹配
						{
							cout << "登陆成功!" << endl;
							cout << "欢迎" << user[i].get_name() << "登陆" << endl;
							return i;
						}
						else
						{
							cout << "密码错误" << endl;
							return -1;
						}
			}
			cout << "此用户不存在!" << endl;
			return -1;
		}
	}
}

int Cdisk::set_code()		//设置新密码
{
	char temp1[10], temp2[10];
	cout << "请输入原密码" << endl;
	cin >> temp1;
	if (strcmp(temp1, code))		//无疑是针对当前用户进行操作,故直接code
	{
		cout << "原密码错误!" << endl;
		return 0;
	}
	while (1)
	{
		cout << "请输入新密码:" << endl;
		cin >> temp1;
		cout << "请再次输入新密码:" << endl;
		cin >> temp2;
		if (strcmp(temp1, temp2))
		{
			cout << "两次密码不相同,请重输!" << endl;
			break;
		}
		cout << "密码设置成功!" << endl;
		strcpy(code, temp1);		//保存新密码
		break;
	}
	return 1;
}

int Cdisk::new_user()		//准备创建新用户
{
	char n[10], c[10];
	int i = 0, j;
	for (i = 0; i < 5; i++)
		if (user[i].get_status() == 0)		//是否有此用户,此尚未存在
			break;
	if (i == 5)
	{
		cout << "已经达到最大用户5个,不能再创建!" << endl;
		return 0;
	}
	user[i].set_status(1);		//为新用户分配权利
	cout << "请输入用户名:" << endl;
	cin >> n;
	if (i > 0)			//已有其它用户存在
	{
		for (j = 0; j < i - 1; j++)
			if (!strcmp(user[j].get_name(), n))
			{
				cout << "此用户名已存在!" << endl;
				return 0;
			}
	}
	cout << "请输入密码:" << endl;
	cin >> c;
	user[i].set_user(n, c);		//调用Cuse的成员函数,传递用户名与密码
	cout << "恭喜,创建用户成功!" << endl;
	return 1;
}

int Cdisk::first_dele_user()		//删除用户
{
	char n[10], c;
	int i;
	cout << "请输入你要删除的用户名" << endl;
	cin >> n;
	for (i = 0; i < 5; i++)		//在查找用户的同时,得到用户序号i
		if (!strcmp(user[i].get_name(), n) && user[i].get_status())
			break;		//找到,跳出
	if (i == 5)
	{
		cout << "出错啦,此用户不存在!" << endl;
		return 0;
	}
	cout << "确认删除此用户?确认Y,取消任意键" << endl;
	cin >> c;
	if (c != 'Y' && c != 'y')
	{
		cout << "已经取消删除!" << endl;
		return 0;
	}
	this->dele_user(i);
	cout << "用户删除成功" << endl;
	return 1;
}

Cuse::Cuse()		//构造函数,初始化成员
{
	status = 0;		//用户权利,即是否被创建标记
	length = 0;		//空间
	now = 0;			//当前目录
	Fhead = 0;		//文件
	Dhead = 0;		//目录
}

Cuse::~Cuse()		//析构,清除程序占用的内存
{
	disk_empty += length;
	length = 0;
	UFD* f = Fhead;
	DIR* d = Dhead;
	while (f != 0)		//文件
	{
		if (f->next == 0)
		{
			this->dele_file(f);
			f = 0;
			break;
		}
		while (f->next->next != 0)
			f = f->next;
		this->dele_file(f->next);
		f->next = 0;
		f = Fhead;
	}
	while (d != 0)		//目录
	{
		if (d->next == 0)
		{
			this->dele_dir(d);
			d = 0;
			break;
		}
		while (d->next->next != 0)
			d = d->next;
		this->dele_dir(d->next);
		d->next = 0;
		d = Dhead;
	}
}


int Cuse::new_file()		//建立新文件
{
	int i = 0, j = 0;
	UFD* f, * p = 0;
	DIR* D;

	p = new UFD;				//开辟一个新的文件结构体
	if (p == 0)
	{
		cout << "无可用内存空间,创建文件失败!" << endl;
		return 1;
	}
	cout << "请输入建立的文件名:";
	cin >> p->name;
	if (now == 0)			//根目录下的文件链
		f = Fhead;
	else				//当前目录下的文件链
		f = now->File_head;
	while (f != 0)			//检查是否文件重名
	{
		if (!strcmp(p->name, f->name))
		{
			cout << "此文件已存在!" << endl;
			return 0;	//退出
		}
		f = f->next;
	}
	cout << "长度:";
	cin >> p->length;
	cout << "属性(0:只读,1:读写):";
	cin >> p->attribute;
	cout << endl;
	if (p->length > disk_empty)		//空间不足
	{
		cout << "文件太大,空间不足,当前空间为:" << disk_empty << endl;
		delete p;
		return 0;
	}
	disk_empty = disk_empty - p->length;	//剩余空闲盘块
	//
	for (i = 0; i < p->length && i < 10; i++)		//文件较小时,直接地址,文件数据盘块号
		for (j; j < 10000; j++)				//位示图法
			if (disk_block[j] == 0)		//空闲
			{
				p->a[i] = j;				//得到此空间
				disk_block[j] = 1;		//标记为已分配出去
				j++;
				break;					//跳出寻找,为文件分配下一空间
			}
	p->p1 = 0;					//一级索引
	p->p2 = 0;					//二级索引
	if (p->length > 10)			//超过10,用一级索引
	{
		p->p1 = new int[100];		//为一级索引分配100个空间
		for (i = 10; i < p->length && i < 110; i++)
			for (j; j < 10000; j++)		//j,继续前面的值
				if (disk_block[j] == 0)
				{
					(p->p1)[i - 10] = j;
					disk_block[j] = 1;
					j++;
					break;
				}
		if (p->length > 110)			//超过110,得用二级索引
		{
			p->p2 = new int[100][100];	//在一级索引的基础上,2维
			for (i = 110; i < p->length; i++)
				for (j; j < 10000; j++)		//j,继续前面的值
					if (disk_block[j] == 0)
					{
						int m = (i - 110) / 100;		//行
						int k = (i - 110) % 100;		//列
						p->p2[m][k] = j;
						disk_block[j] = 1;
						j++;
						break;
					}
		}
	}
	if (now == 0)	//根目录下的文件
	{
		p->next = Fhead;	//后继结点指向头,即新指点在前
		Fhead = p;	//新结点在头
	}
	else
	{
		p->next = now->File_head;
		now->File_head = p;
	}
	length += p->length;	//用户总空间大小增加
	if (now != 0)			//子目录下空间大小增加
	{
		now->length += p->length;
		D = now->above;	//上一级目录
		while (D != 0)		//上级目录(根目录已实现)空间增加
		{
			D->length += p->length;
			D = D->above;		//逐级向上
		}
	}

	return 0;
}

int Cuse::new_dir()		//建立新目录
{
	DIR* p, * h;
	cout << "请输入新目录的名字:" << endl;
	p = new DIR;
	cin >> p->name;		//目录名
	p->Dir_head = 0;		//目录下的目录链为空
	p->length = 0;		//
	p->File_head = 0;		//目录下的文件为空
	if (now == 0)			//当前为主目录
		h = Dhead;	//第一次时,h=0;指向目录链
	else
		h = now->Dir_head;//当前的目录链
	while (h != 0)	//此目录下存在其它子目录
	{
		if (!strcmp(h->name, p->name))
		{
			cout << "此目录已存在!" << endl;
			return 0;
		}
		h = h->next;
	}
	if (now == 0)		//当前为主目录
	{
		p->above = 0;		//主目录里目录的上一结点为0
		p->next = Dhead;		//把原目录接入新目录后面(Dhead初始为0)
		Dhead = p;		//Dhead始终指向最新目录结点
	}
	else
	{
		p->above = now;		//当前目录为新目录的上一结点
		p->next = now->Dir_head;	//反序插入新目录
		now->Dir_head = p;	//更新目录链
	}
	cout << "目录创建成功" << endl;
	return 1;
}

int Cuse::goback()		//向上返回
{
	if (now == 0)
	{
		cout << "已是主目录,不能向上!" << endl;
		return 0;
	}
	now = now->above;		//上一结点
	return 1;
}

int Cuse::open_dir()	//打开目录
{
	char name[10];
	DIR* p;
	if (now == 0)	//当前主目录
		p = Dhead;
	else
		p = now->Dir_head;	//p指向目录链
	cout << "请输入你要打开的目录名:" << endl;
	cin >> name;
	//int flag=0;
	while (p != 0)
	{
		if (strcmp(p->name, name) == 0)
		{
			now = p;	//找到目录,now标记
			return 1;
		}
		p = p->next;
	}
	cout << "当前没此目录" << endl;
	return 0;
}

int Cuse::first_dele_file()	//删除文件的前面工作
{
	char temp[10], a[5];
	cout << "你要删除的文件名:" << endl;
	cin >> temp;
	UFD* f = Fhead;	//数据文件头指针
	UFD* above = 0;
	if (now != 0)
		f = now->File_head;	//当前目录下的数据文件
	while (f != 0)
	{
		if (!strcmp(f->name, temp))
			break;	//找到,跳出
		above = f;	//标记第一个文件
		f = f->next;
	}
	if (f == 0)
	{
		cout << "此文件不存在" << endl;
		return 0;
	}
	cout << "确定删除" << f->name << "文件吗?按0确定,其他键取消" << endl;
	cin >> a;
	if (a[0] != '0')
	{
		cout << "已取消删除文件。" << endl;
		return 0;
	}
	disk_empty += f->length;	//回收此数据文件的空间大小
	if (now == 0)	//根目录
	{
		if (f == Fhead)
			Fhead = Fhead->next;
		else
			above->next = f->next;
	}
	else
	{
		DIR* d = now;
		while (d != 0)
		{
			d->length = f->length;
			d = d->above;
		}
		if (f == now->File_head)
			now->File_head = now->File_head->next;
		else
			above->next = f->next;
	}
	length -= f->length;
	this->dele_file(f);
	cout << "删除成功" << endl;
	return 1;
}

int Cuse::dele_file(UFD* f)	//具体实现删除文件
{
	int i = 0, m;
	for (i = 0; i < 10 && i < f->length; i++)	//回收文件具体空间,重置空闲
	{
		m = f->a[i];
		disk_block[m] = 0;
	}
	if (f->p1 != 0)	//回收一级索引
	{
		for (i = 10; i < 110 && i < f->length; i++)
		{
			m = f->p1[i - 10];
			disk_block[m] = 0;
		}
		delete[](f->p1);
	}
	if (f->p2 != 0)	//回收二级索引
	{
		for (i = 110; i < f->length; i++)
		{
			m = (f->p2)[(i - 110) / 100][(i - 110) % 100];
			disk_block[m] = 0;
		}
		delete[](f->p2);
		delete f;
	}
	f = 0;	//要删除的文件为空了
	return 1;
}

int Cuse::first_dele_dir()	//删除目录的前奏
{
	char n[10];
	char c;
	DIR* p, * above = 0;
	p = Dhead;	//指向根目录下的目录链
	if (now != 0)
		p = now->Dir_head;	//指向当前目录下的目录链
	cout << "要删除的目录名:" << endl;
	cin >> n;
	while (p != 0)
	{
		if (!strcmp(p->name, n))
			break;	//找到要删除的目录,跳出
		above = p;	//保存前一结点
		p = p->next;
	}
	if (p == 0)
	{
		cout << "没有这个目录!" << endl;
		return 0;
	}
	cout << "确定删除当前目录及此目标上的所有信息吗?按0确定,其他键取消" << endl;
	cin >> c;
	if (c != '0')
		return 0;
	disk_empty += p->length;	//回收磁盘空间
	if (now == 0)
	{
		if (p == Dhead)	//如果是根目录下头结点,直接移动Dhead
			Dhead = Dhead->next;
		else
			above->next = p->next;//中间抽掉目标
	}
	else
	{
		if (p == now->Dir_head)
			now->Dir_head = now->Dir_head->next;
		else
			above->next = p->next;
		above = now;	//当前目录
		while (above != 0)
		{
			above->length -= p->length;//用above标记当前目录,进行大小更新
			above = above->above;	//向上一级
		}
	}
	length -= p->length;	//根目录大小更新
	this->dele_dir(p);
	p = 0;
	cout << "删除成功!" << endl;
	return 1;
}

int Cuse::dele_dir(DIR* p)	//具体实现删除目录的工作
{
	int flag = 0;
	DIR* d = p->Dir_head;	//当前目录下的目录链表
	UFD* f = p->File_head;	//当前目录下的文件链
	if (f != 0)
	{
		while (p->File_head->next != 0)//删除目录里的文件
		{
			f = p->File_head;
			while (f->next->next != 0)
				f = f->next;
			this->dele_file(f->next);
			f->next = 0;
		}
		if (p->File_head->next == 0)
		{
			this->dele_file(p->File_head);//删除头文件
			p->File_head = 0;
		}
	}
	if (d != 0)	//删除目录下的目录
	{
		while (p->Dir_head->next != 0)
		{
			d = p->Dir_head;
			while (d->next->next != 0)
				d = d->next;
			this->dele_dir(d->next);
			d->next = 0;
		}
		if (p->Dir_head->next == 0)
		{
			this->dele_dir(p->Dir_head);//删除目录链头结点
			p->Dir_head = 0;
		}
	}
	delete p;	//释放p占用的内存
	p = 0;		//置0
	return 1;
}

int Cuse::dis_now()	//显示当前目录
{
	DIR* d = Dhead;
	UFD* f = Fhead;
	if (now != 0)
	{
		d = now->Dir_head;	//当前目录下的目录链
		f = now->File_head;
	}
	if (d == 0 && f == 0)
	{
		cout << "当前目录为空" << endl;
		return 0;
	}
	cout << "当前目录大小:";
	if (now == 0)
		cout << length;
	else
		cout << now->length;
	cout << endl;
	if (d == 0)
		cout << "当前目录下没有目录" << endl;
	else
	{
		cout << "当前目录下包含如下目录:" << endl;
		cout << setw(14) << "目录名称" << setw(14) << "目录大小" << endl;
		while (d != 0)
		{
			cout << setw(14) << d->name << setw(14) << d->length << endl;
			d = d->next;
		}
	}
	if (f == 0)
		cout << "当前目录下没有文件" << endl;
	else
	{
		cout << "当前目录下包含如下文件:" << endl;
		cout << setw(14) << "文件名称" << setw(14) << "文件大小" << setw(14) << "文件属性" << endl;
		while (f != 0)
		{
			cout << setw(14) << f->name << setw(14) << f->length << setw(14) << f->attribute << endl;
			f = f->next;
		}
	}
	return 1;
}

int Cuse::open_file()	//打开文件
{
	char n[10];
	cout << "请输入要打开的文件名" << endl;
	cin >> n;
	UFD* f = Fhead;	//文件头指针
	if (now != 0)
		f = now->File_head;	//指向文件
	while (f != 0)
	{
		if (!strcmp(f->name, n))
		{
			cout << "文件打开成功" << endl;
			return 1;
		}
		f = f->next;
	}
	cout << "当前目录无此文件" << endl;
	return 0;
}

int Cuse::set_code()	//设置密码
{
	char a1[10], a2[10];
	cout << "请输入原密码" << endl;
	cin >> a1;
	if (strcmp(a1, code))
	{
		cout << "密码错误" << endl;
		return 0;
	}
	while (1)
	{
		cout << "请输入新密码:" << endl;
		cin >> a1;
		cout << "再次输入新密码:" << endl;
		cin >> a2;
		if (strcmp(a1, a2))
			cout << "两次输入密码不同,请重输!" << endl;
		else
		{
			strcpy(code, a1);
			cout << "密码修改成功!" << endl;
			break;
		}
	}
	return 1;
}

DIR* Cuse::get_now()	//得到当前目录路径
{
	return now;
}

int Cuse::set_user(char* n, char* c)//建立用户与密码
{
	strcpy(name, n);
	strcpy(code, c);
	status = 1;
	return 1;
}

void Cuse::set_status(int b)//标记分配
{
	status = b;
}

int Cuse::get_status()//探取是否分配
{
	return status;
}

const char* Cuse::get_code()//得到密码
{
	return code;
}

const char* Cuse::get_name()//得到名字
{
	return name;
}

int Cuse::get_length()//得到长度
{
	return length;
}

int Cuse::dis_dir(DIR* d)//显示目录
{
	if (d == 0)
		return 0;
	if (d->above != 0)
		this->dis_dir(d->above);//递归调用此功能
	cout << "	" << d->name << '\n';
	return 0;
}

int Cuse::dis_file()//查看文件
{
	int i;
	char n[10];
	UFD* f = Fhead;
	if (now != 0)
		f = now->File_head;
	cout << "请输入要查看的文件名:" << endl;
	cin >> n;
	while (f != 0)
	{
		if (!strcmp(n, f->name))	//找到此文件,跳出
			break;
		f = f->next;
	}
	if (f == 0)
	{
		cout << "当前目录下没此文件" << endl;
		return 0;
	}
	if (f->attribute == 0)
		cout << "文件类型:只读文件\n";
	else
		cout << "文件类型:读写文件\n";
	cout << "文件长度:" << f->length << "\n";
	cout << "占用硬盘块号如下:" << endl;
	for (i = 0; i < f->length && i < 10; i++)		//直接存放的
	{
		cout << setw(6) << f->a[i];
		if ((i + 1) % 10 == 0)
			cout << endl;
	}
	for (i = 10; i < f->length && i < 110; i++)	//一级索引存放的
	{
		cout << setw(6) << f->p1[i - 10];
		if ((i + 1) % 10 == 0)
			cout << endl;
	}
	for (i = 110; i < f->length; i++)	//二级索引存放的
	{
		cout << setw(6) << f->p2[(i - 110) / 100][(i - 110) % 100];
		if ((i + 1) % 10 == 0)
			cout << endl;
	}
	cout << endl;
	cout << "存放的内容:" << f->str;
	cout << endl;
	return 1;
}

int Cuse::write()//写文件
{
	int i;
	char n[10];
	UFD* f = Fhead;
	if (now != 0)
		f = now->File_head;
	cout << "请输入要写入的文件名:" << endl;
	cin >> n;
	while (f != 0)
	{
		if (!strcmp(n, f->name))	//找到此文件,跳出
			break;
		f = f->next;
	}
	if (f == 0)
	{
		cout << "当前目录下没此文件" << endl;
		return 0;
	}
	if (f->attribute == 0) {
		cout << "文件类型:只读文件,不可写\n";
		return 0;
	}
	else {
		cout << "输入要写的内容\n";
	}
	getchar();
	getline(cin, f->str);
}

int Cuse::dele_user()//删除用户
{
	length = 0;	//用户空间置0
	Fhead = 0;
	Dhead = 0;
	now = 0;
	status = 0;
	return 1;
}


void main()
{
	char c;
	Cdisk D;		//管理员类的对象
	int i = 1, n, flag = 1, t = 0;

	while (flag)
	{
		cout << "*******************欢迎使用文件系统**************************" << endl;
		cout << endl;
		cout << "***                 1.管理员登陆" << endl;
		cout << "***                 2.用户登陆" << endl;
		cout << "***                 3.退出系统" << endl;
		cout << endl;
		cout << "*************************************************************" << endl;

		cout << "\n请输入选择:";
		cin >> c;
		switch (c)
		{
		case '1':
			n = D.login(c);
			flag = 1;
			system("cls");
			cout << "管理员登陆成功!" << endl;
			while (flag)
			{
				cout << "*************************************************************" << endl;
				cout << "***1.创建用户" << endl;
				cout << "***2.删除用户" << endl;
				cout << "***3.查看当前用户" << endl;
				cout << "***4.修改密码" << endl;
				cout << "***5.返回登陆窗口" << endl;
				cout << "*************************************************************" << endl;
				cout << "请选择:";
				cin >> c;
				cout << endl;
				switch (c) {
				case '1':
					D.new_user();
					break;
				case '2':
					D.first_dele_user();
					break;
				case '3':
					D.dis_disk();//查看当前用户
					break;
				case '4':
				{
					if (t == 0)	//t作标记,防止重复设置密码出错
						strcpy(D.code, "123");//将“123”复制到D.code中  ?
					D.set_code();
					t++;
					break;
				}
				case '5':
				{
					flag = 0;
					system("cls");
				}
				break;
				default:
					cout << "请输入1-5!" << endl;
				}
			}
			flag = 1;
			break;
		case '2':
			n = D.login(c);
			if (n == -1)
				break;
			cout << "*************************************************************" << endl;
			cout << "***1.创建文件" << endl;
			cout << "***2.删除文件" << endl;
			cout << "***3.写文件" << endl;
			cout << "***4.读文件" << endl;
			cout << "***5.创建目录" << endl;
			cout << "***6.删除目录" << endl;
			cout << "***7.打开目录" << endl;
			cout << "***8.返回上一层目录" << endl;
			cout << "***9.查看当前目录" << endl;
			cout << "***A.修改密码" << endl;
			cout << "***0.安全退出" << endl;
			cout << "*************************************************************" << endl;
			while (flag)
			{
				cout << "用户:" << D.user[n].get_name() << '\n' << "目录为:root\n";
				D.user[n].dis_dir(D.user[n].get_now());
				cout << endl;
				cout << "请输入选择:";
				cin >> c;
				cout << endl;
				switch (c)
				{
				case '1':
					D.user[n].new_file();
					break;
				case '2':
					D.user[n].first_dele_file();
					break;
				case '3':
					D.user[n].write();
					break;
				case '4':
					D.user[n].dis_file();
					break;
				case '5':
					D.user[n].new_dir();
					break;
				case '6':
					D.user[n].first_dele_dir();
					break;
				case '7':
					D.user[n].open_dir();
					break;
				case '8':
					D.user[n].goback();
					break;
				case '9':
					D.user[n].dis_now();
					break;
				case'A':
					D.user[n].set_code();
					break;
				case '0':
				{
					flag = 0;
					system("cls");
				}
				break;
				default:
					cout << "请输入0-9" << endl;
				}
			}
			flag = 1;
			break;
		case '3':
			flag = 0;
			break;
		default:
			cout << "请输入1-3!" << endl;
		}
	}
}

(五)实验截图

(六)温馨提示:直接将代码放在visual studio运行可能发生以下错误:

解决方案:

1)右击当前代码文件--->>属性 

2)C/C++  ----->> 常规------>>双击“SDL检查”后面的文本框,使其改变为“否”------->>"确定"

 3)做好以上修改,就可正常运行代码

以上代码只做参考,如有不足,请指出!

 

  • 7
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值