上学期学校的操作系统课程设计, 有一个简易的文件系统,分享一下
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
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;
}