操作系统课程设计---简单文件系统C语言实现

上学期学校的操作系统课程设计, 有一个简易的文件系统,分享一下

要求

接口调用图

在这里插入图片描述

源代码

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;


struct TreeNode
{
	struct TreeNode* child;
	struct TreeNode* parent;
	string name;
	char type;
	struct TreeNode* brother;
};

struct file_list
{
	struct TreeNode head;
	struct TreeNode* cur_head;
};

struct user
{
	string name;
	string password;
	int pride;
	file_list file;
};



user* cur_user = nullptr;//当前用户
string ls;//当前路径
TreeNode* cur_dir = &cur_user->file.head;

TreeNode* get_TreeNode()
{
	return new TreeNode;
}


void ls_file()
{
	cout << "name   \t  type " << endl;
	TreeNode* cur = nullptr;
	if (cur_user->file.head.child)
	{
		cur = cur_user->file.cur_head;
	}

	while (cur)
	{
		cout << cur->name << "\t" << cur->type << endl;
		cur = cur->brother;
	}
	cout << endl << endl;
}


void create_user()
{
	string name;
	string password;

	int pride = 0;
create:
	name.clear();
	password.clear();
	cout << "请输入新建的用户名:" << endl;
	cin >> name;

	cout << "请输入密码: " << endl;
	cin >> password;

	cout << " 请输入权限: 1. 管理员 0. 普通用户" << endl;
	cin >> pride;

	FILE* fp = fopen("user", "rb");


	user* tmp = new user;
	while (fread(tmp, sizeof(user), 1, fp) == 1)
	{
		if (name == tmp->name)
		{
			cout << "用户名已经存在,请重新输入" << endl;
			goto create;
		}
	}
	tmp->name = name;
	tmp->password = password;
	tmp->pride = pride;
	fp = fopen("user", "wb+");
	//写入user
	fwrite(tmp, sizeof(user), 1, fp);

	fclose(fp);

	delete tmp;
}

//新建
void new_file()
{
	cout << "请选择 : 1.新建dir  2. 新建file" << endl;
	int input = 0;
	cin >> input;
	if (1 == input)
	{
		//新建目录
		TreeNode* newnode = get_TreeNode();
		cout << "请输入文件夹名字: " << endl;

		cin >> newnode->name;
		newnode->type = 'd';
		newnode->brother = nullptr;
		newnode->child = nullptr;
		
		//每个用户一个头,如果进入或者回退,应该指向当前层的头
		if (cur_user->file.cur_head == nullptr)
		{
			if (cur_user->file.head.child == nullptr)
			{
				cur_user->file.head.child = newnode;
				newnode->parent = &cur_user->file.head;
			}
			else
			{
				newnode->parent = cur_dir;
			}

			//!=
			if (cur_dir != &(cur_user->file.head))
			{
				cur_dir->child = newnode;
			}

			cur_user->file.cur_head = newnode;
		}
		else
		{
			if (cur_dir)
			{
				cur_dir->child = cur_user->file.cur_head;
				cur_user->file.cur_head->parent = cur_dir;
			}
			//说明已经不是空
			//找当前尾巴
			TreeNode* tail = cur_user->file.cur_head;
			while (tail->brother)
			{
				tail = tail->brother;
			}
			tail->brother = newnode;

			newnode->parent = cur_user->file.cur_head->parent;
		}
	}
	else if(2 == input)
	{
		TreeNode* newnode = get_TreeNode();
		string name;
		cout << "请输入文件名字: " << endl;
		cin >> newnode->name;
		newnode->type = '-';
		newnode->brother = nullptr;
		newnode->child = nullptr;
		newnode->parent = nullptr;
		if (cur_user->file.cur_head == nullptr)
		{
			if (cur_user->file.head.child == nullptr)
			{
				cur_user->file.head.child = newnode;
			}
			else
			{
				newnode->parent = cur_dir;
			}

			//!=
			if (cur_dir != &(cur_user->file.head))
			{
				cur_dir->child = newnode;
			}

			cur_user->file.cur_head = newnode;
		}
		else
		{
			if (cur_dir)
			{

				cur_dir->child = cur_user->file.cur_head;
				cur_user->file.cur_head->parent = cur_dir;
			}
			//说明已经不是空
			//找当前尾巴
			TreeNode* tail = cur_user->file.cur_head;
			while (tail->brother)
			{
				tail = tail->brother;
			}
			tail->brother = newnode;
			newnode->parent = cur_user->file.cur_head->parent;
		}
		FILE* fp = fopen((newnode->name).c_str(), "w");
		fclose(fp);
	}
}

void destroy(TreeNode* current_head)
{
	if (current_head == nullptr)
	{
		return;
	}
	else
	{
		TreeNode* cur = current_head;

		while (cur)
		{
			TreeNode* next = cur->brother;
			if (cur->type == 'd')
			{
				destroy(cur->child);
			}
			delete cur;
			cur = next;
		}
	}
}

//用户登陆
bool login()
{
	string name;
	string password;

	cout << "请输入用户名:" << endl;
	cin >> name;
	cout << "请输入密码 : " << endl;
	cin >> password;

	if (name == "root" && password == "root")
	{
		delete cur_user;
		cur_user = new user;
		cur_user->pride = 1;
		cur_user->name = "root";
		cur_user->password = "root";
		cur_user->file.head.brother = nullptr;
		cur_user->file.head.child = nullptr;
		cur_user->file.head.parent = nullptr;

		cur_dir = &cur_user->file.head;

		cur_user->file.cur_head = nullptr;
		return true;
	}
	else
	{
		FILE* fp = fopen("user", "rb");
		if (nullptr == fp)
		{
			cout << "文件列表错误";
			exit(-1);
		}
		else //读文件
		{
			delete cur_user;
			cur_user = new user;
			user* tmp = new user;
			while (fread(tmp, sizeof(user), 1, fp) == 1)
			{
				if (name == tmp->name && password == tmp->password)
				{
					if (tmp->pride == 1)
					{
						cur_user->pride = 1;
					}
					cur_user->name = name;
					cur_user->password = tmp->password;
					cur_user->file.cur_head = nullptr;

					cur_dir = &cur_user->file.head;

					cur_user->file.head.brother = nullptr;
					cur_user->file.head.child = nullptr;
					cur_user->file.head.parent = nullptr;
					return true;
				}
			}
			delete tmp;
		}
		fclose(fp);

	}
	return false;
}

void cd_path()
{
	if (cur_user->file.cur_head == nullptr)
	{
		cout << "没有路径可以进入,请先新建" << endl;
		return;
	}
	cout << "请输入要进入的文件夹" << endl;
	string path;
	cin >> path;

	TreeNode* cur = cur_user->file.cur_head;

	while (cur)
	{
		if (cur->name == path && cur->type == 'd')
		{
			break;
		}
		cur = cur->brother;
	}

	if (!cur)
	{
		cout << " 没有此文件夹" << endl;
	}
	else
	{
		cur_dir = cur_user->file.cur_head;
		cur_user->file.cur_head = cur_user->file.cur_head->child;
	}

}

void del()
{
	cout << "请输入要删除的文件";
	string filename;
	cin >> filename;

	TreeNode* prev = nullptr;
	TreeNode* cur = cur_user->file.cur_head;

	while (cur)
	{
		if (cur->name == filename)
		{
			break;
		}
		prev = cur;
		cur = cur->brother;
	}
	if (!cur)
	{
		cout << "没有找到对应的文件" << endl;
		return;
	}
	TreeNode* next = cur->brother;
	if (cur->type == '-')
	{
		string del = "del ";
		del += cur->name;

		if (!prev) //prev == nullptr  说明删除的是第一个
		{
			cur_user->file.cur_head = next;
		}
		else
		{
			prev->brother = next;

		}
		system(del.c_str());
	}
	else
	{
		if (!prev) //prev == nullptr  说明删除的是第一个
		{
			cur_user->file.cur_head = next;
		}
		else
		{
			prev->brother = next;
		}
	}
}

void readfile()
{
	cout << "请输入要读取的文件名: " << endl;
	string filename;
	cin >> filename;

	TreeNode* cur = cur_user->file.cur_head;

	while (cur)
	{
		if (cur->name == filename)
		{
			break;
		}
		cur = cur->brother;
	}

	if (!cur)
	{
		cout << "找不到对应文件" << endl;
		return;
	}
	if (cur->type == 'd')
	{
		cout << "文件夹不能读取";
		return;
	}

	FILE* fp = fopen(filename.c_str(), "r");
	char buf[1024] = { 0 };
	while (fgets(buf, 1023, fp))
	{
		cout << buf << endl;
	}
	fclose(fp);

}

void writefile()
{
	cout << "请输入要编辑的文件 : " << endl;
	string filename;
	cin >> filename;

	TreeNode* cur = cur_user->file.cur_head;
	while (cur)
	{
		if (cur->name == filename)
		{
			break;
		}
		cur = cur->brother;
	}

	if (!cur)
	{
		cout << "找不到对应文件" << endl;
		return;
	}
	if (cur->type == 'd')
	{
		cout << "文件夹不能写入";
		return;
	}

	FILE* fp = fopen(filename.c_str(), "w");
	
	char ch;
	cout << "请输入: 回车键结束" << endl;
	ch = getchar();
	while ((ch = getchar()) != '\n')
	{
		fputc(ch, fp);

	}
	fclose(fp);
}

void menu_ordinary()
{
	cout << "1.文件列表  2.新建        3.进入路径  4.删除       " << endl;;
	cout << "6.读文件      7.写文件    8.回退上层   " << endl;
	cout << " 9.当前路径   10.注销  " << endl;
}

void menu_admin()
{
	cout << "1.文件列表  2.新建        3.进入路径  4.删除       " << endl;;
	cout << " 5.新建用户  6.读文件      7.写文件  8.回退上层   " << endl;
	cout << " 9.当前路径   10.注销  " << endl;
}

void menu()
{
	cout << "         OS课设: 简单文件系统      " << endl;
	cout << "        姓名:              学号 :      " << endl;
	cout << "                                                " << endl;
}

void go_back()
{
	
	if (cur_dir == &cur_user->file.head)
	{
		cout << "已经是最顶层" << endl;
		return;
	}
	else
	{
		cur_user->file.cur_head = cur_dir;
		cur_dir = cur_dir->parent;
	}
}

//显示当前路径
void pwd()
{
	string path = "/";
	path += cur_user->name;

	TreeNode* cur = nullptr;
	if (cur_dir)
	{
		cur = cur_dir;
	}
	int n = path.size();


	while (cur && cur != &(cur_user->file.head))
	{
		for (int i = 0; i < cur->name.size(); ++i)
		{
			path += cur->name[cur->name.size() - i - 1];
		}
		path += "/";
		cur = cur->parent;
	}
	string::iterator it = path.begin();
	it += n;

	reverse(it, path.end());

	cout << endl << path << endl << endl;

}

int main(void)
{
	system("del user");
	FILE* fp = fopen("user", "wb+");

	user tmp;

	tmp.name = "root";
	tmp.password = "root";
	tmp.pride = 1;
	//写入user
	fwrite(&tmp, sizeof(user), 1, fp);
	fclose(fp);
	do
	{
	flag:
		menu();
		bool ret = login();
		if (!ret)
		{
			cout << "请重新登录" << endl;
			goto flag;
		}
		else
		{
			system("cls");
			while (1)
			{
				if (cur_user->pride == 1)
				{
					int input = 0;
					menu_admin();
					cout << "请选择>" << endl;
					cin >> input;
					switch (input)
					{
					case 1:
						ls_file();
						break;
					case 2:
						new_file();
						break;
					case 3:
						cd_path();
						break;
					case 4:
						del();
						break;
					case 5:
						create_user();
						break;
					case 6:
						readfile();
						break;
					case 7:
						writefile();
						break;
					case 8:
						go_back();
						break;
					case 9:
						pwd();
						break;
					case 10:
						goto flag;
						break;
			
					default:
						break;
					}
				}
				else
				{
					int input = 0;
					menu_ordinary();
					cout << "请选择>" << endl;
					cin >> input;
					switch (input)
					{
					case 1:
						ls_file();
						break;
					case 2:
						new_file();
						break;
					case 3:
						cd_path();
						break;
					case 4:
						del();
						break;
					case 5:
						create_user();
						break;
					case 6:
						readfile();
						break;
					case 7:
						writefile();
						break;
					case 8:
						go_back();
						break;
					case 9:
						pwd();
						break;
					case 10:
						goto flag;
						break;

					default:
						break;
					}

				}
			}
			
		}

	} while (true);
	destroy(cur_user->file.head.child);

	cout << "程序退出" << endl;
	delete cur_user;
	return 0;
	}

  • 21
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值