1、实验概述

  • 实现多用户文件系统,每次用户可保存多个文件,一次运行用户可打开5个文件。
  • 实现文件的相关操作,包括创建、删除、打开、关闭以及读写功能。
  • 采用二级目录,设置主目录MFD、用户文件目录UFD。
  • 设置文件权限保护码:1-可执行,2-只读,3-只写。
  • 实现用户登录、退出、退出系统等操作。
  • 为简化程序,不对用户信息进行保存,即每次运行,文件系统都相当于初始化一次。

2、结构体设计

(1)用户users

typedef struct users

{

char    name[8];    //用户名

char    pwd[10];    //密码

}users;

(2)主文件目录MFD

struct MFD{ // 主文件目录

string u_name; // 用户名

int addr; // 指向子目录指针

}mfd[10];

(3)用户文件目录UFD

struct UFD{ // 用户文件目录

File file[1000];

string u_name;       // 用户名

int id;              // 文件的总数

int cnt;             // 用户文件存在的个数

int open_cnt;        // 用户打开文件个数,最大为k

void init() ;        //初始化数据项

void create() ;      //创建用户文件

void del(int pos);   //删除用户文件

void open(int pos);  //打开文件

void close(int pos); //关闭文件

void read(int pos);  //读文件

void write(int pos); //写文件

int Find(string name);//根据文件名查找文件

}ufd[10];

(4)文件File

struct File{

string name;        // 文件名

bool exist;     // 0表示文件已经删除,1表示文件存在

bool state;     // 0表示文件处于关闭状态,1表示打开状态

int protect;    // 1表示只执行,2表示只读,3表示只写,4表示可读可写

string content; // 文件内容

void create();  //创建

void del();     //删除

bool open();    //打开

bool close();   //关闭

void read();    //读

void write();   //写

};

3、文件系统的流程图

4、代码实现

(1)User.h

头文件里新加用户信息,用于登录,这种实现方法简单,用户信息固定。

当然,也可以尝试建立一个文件存储用户信息,登陆时将输入的账号密码与文件已有数据比较,只是考虑到这次实验的重点在于体验多用户系统,故而一切从简。

typedef struct users
{char    name[8];char    pwd[10];
}users;
users usrarray[8] =
{
"usr1","usr1",
"usr2","usr2",
"usr3","usr3",
"usr4","usr4",
"usr5","usr5",
"usr6","usr6",
"usr7","usr7",
"usr8","usr8",
};

(2)UFD.h等只是上述的结构体,无追加内容

(3)File.h

struct File{string name; // 文件名bool exist; // 0表示文件已经删除,1表示文件存在bool state; // 0表示文件处于关闭状态,1表示打开状态int protect; // 1表示只执行,2表示只读,3表示只写,4表示可读可写string content; // 文件内容void create();void del();bool open();bool close();void read();void write();
};
void File::create(){cout << "请输入文件名与文件权限(1只执行 2只读 3可写): "; cin >> name >> protect;cout << "请输入文件内容: "; cin >> content;exist = 1;state = 0;
}
void File::del(){exist = 0;
}
bool File::open(){if(protect == 1) { cout << "打开失败,该文件为只执行文件!" << endl; return 0;}else if(state == 1) { cout << "该文件已处于打开状态" << endl; return 0;}else { state = 1; cout << "打开成功" << endl; return 1;}
}
bool File::close(){if(state == 0) { cout << "该文件已处于关闭状态" << endl; return 0;}else { state = 0; cout << "关闭成功" << endl; return 1;}
}
void File::read(){if(protect == 1) { cout << "读文件失败,该文件为只执行文件!" << endl; }else { cout << content << endl;}
}
void File::write(){if(protect==1 || protect==2) { cout << "写文件失败,该文件不可写" << endl;}else {string cont; cout << "请输入写入内容: "; cin >> cont;content=cont; cout << "写入成功!" << endl;}
}

(4)main.cpp

#include <iostream>
#include<stdlib.h>
#include <cstdio>
#include <cstring>
#include <string>#include "File.h"
#include "User.h"using namespace std;struct MFD{ // 主文件目录string u_name; // 用户名int addr; // 指向子目录指针
}mfd[10];
int mfdcnt = 8; // 用户数
int k = 5; // 每个用户最多打开的文件数
struct UFD{ // 用户文件目录File file[1000];string u_name; // 用户名int id; // 文件的总数int cnt; // 用户文件存在的个数int open_cnt; // 用户打开文件个数,最大为kvoid init() { cnt=0; open_cnt=0; id=0;}void create() { file[id].create(); cnt++; id++;}void del(int pos) { file[pos].del(); cnt--;}void open(int pos) {if(open_cnt == k) cout<<"您已经打开了"<<k<<"个文件,不能再打开了" << endl;else {if(file[pos].open() == 1) open_cnt++;}}void close(int pos) { if(file[pos].close() == 1) open_cnt--; }void read(int pos) { file[pos].read(); }void write(int pos) { file[pos].write(); }int Find(string name) {int pos = -1;  // 需要操作文件的位置for(int i=0; i<id; i++)if(file[i].exist==1 && file[i].name==name) return pos=i;cout << "找不到该文件,请检查文件名\n";return pos;}
}ufd[10];void see(string u_name){int addr = -1;for(int i=0; i<mfdcnt; i++){if(mfd[i].u_name == u_name) addr = mfd[i].addr;}if(addr == -1) { cout << "没有该用户" << endl;}else{UFD user = ufd[addr];cout << "********************用户名" << u_name << "********************\n";cout << "文件个数: " << user.cnt << "\t文件打开数: " << user.open_cnt << endl;cout << "文件名\t文件状态\t文件权限\t文件内容\n";for(int i=0; i<user.id; i++){File f = user.file[i];if(f.exist == 0) continue;cout << f.name << "\t";if(f.state == 0) cout << "关闭\t\t";else cout << "打开\t\t";if(f.protect == 1) cout << "只执行\t\t";else if(f.protect == 2) cout << "只读\t\t";else if(f.protect == 3) cout << "可写\t\t";cout << f.content << endl;}}
}
void menu(){printf("************* 操作目录        *****************\n");printf("************* 0: 退出         *****************\n");printf("************* 1: 创建文件     *****************\n");printf("************* 2: 删除文件     *****************\n");printf("************* 3: 打开文件     *****************\n");printf("************* 4: 关闭文件    *****************\n");printf("************* 5: 读文件      *****************\n");printf("************* 6: 写文件      *****************\n");printf("************* 7: 查看UFD      *****************\n");printf("************* 8: 退出当前用户      *****************\n");
}
void operate(){string u_name;cout << "请输入登入用户名称: "; cin >> u_name;int u_id = -1;for(int i=0; i<mfdcnt; i++){if(mfd[i].u_name == u_name){while(1){cout<<"输入密码:";   string pwd; cin>>pwd;if(pwd == usrarray[i].pwd){cout<<"密码正确,登入成功!"<<endl;u_id = mfd[i].addr;break;}else{cout<<"密码错误。"<<endl;}}}}if(u_id == -1) { cout << "没有该用户" << endl; return ;}system("pause");while(1){system("cls");menu();int op; cin >> op;if(op == 0) break;if(op == 1) ufd[u_id].create();else if(op == 7) see(u_name);else if(op == 8){cout << "请输入登入用户名称: "; cin >> u_name;for(int i=0; i<mfdcnt; i++){if(mfd[i].u_name == u_name){while(1){cout<<"输入密码:";   string pwd; cin>>pwd;if(pwd == usrarray[i].pwd){cout<<"密码正确,登入成功!"<<endl;u_id = mfd[i].addr;break;}else{cout<<"密码错误。"<<endl;}}}}}else {string name;cout << "请输入操作文件名: "; cin >> name;int pos = ufd[u_id].Find(name);if(pos == -1) continue;if(op == 2) ufd[u_id].del(pos);else if(op == 3) ufd[u_id].open(pos);else if(op == 4) ufd[u_id].close(pos);else if(op == 5) ufd[u_id].read(pos);else if(op == 6) ufd[u_id].write(pos);}system("pause");}
}
void InitUser(){for(int i=0; i<mfdcnt; i++){mfd[i].u_name = usrarray[i].name;  mfd[i].addr = i;ufd[i].u_name = usrarray[i].name;}
}
int main(){cout << "当前用户数m: "; cout<< mfdcnt<<endl;cout << "用户最多可以打开的文件数: "; cout<<k<<endl;InitUser();while(1){operate();cout << "还要继续操作吗? (0 or 1): ";int op; cin >> op; if(op == 0) break;}
}

4、一些测试截图

(1)登录usr1

(2)在usr1用户目录下创建文件test1,权限为只读;test2,权限为可写

(3)查看usr1用户主目录下文件

(4)切换用户,重复创建文件,查看文件过程

5、总结

本篇博客内容只是对多用户文件系统的一个简单模拟。简易文件系统的功能基本都实现了。在文件系统中,可以进行用户切换、用户登录、在用户文件目录下进行文件的相关操作、显示用户的UFD等。

但是,其实本文件系统还是有提升空间,因为文件系统没有实现信息存储功能,运行结束后,不存储用户信息以及用户的文件信息,每次运行都相当于初始化一遍。

仅供参考,谢谢。

南邮操作系统实验之文件系统实验——实现简单多用户文本相关推荐

  1. 【南邮操作系统实验】银行家算法Java版

    这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法. 我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出. import java.util.*; /* ...

  2. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)

    页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...

  3. 南邮 | 操作系统实验三:存储管理

    理解操作系统存储管理原理. 研读Linux 内存管理所用到的文件include/linux/mm.h,主要包括两个数据结构:mem_map.free_area. 在Linux 下,用malloc()函 ...

  4. 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版

    页面置换算法Java版 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 帮女朋友写了份 Python版的,Python版戳这里 帮女朋友舍友写了份 C++ 版的 ...

  5. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) C++ 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 写好了 Java 版和 Python 版的- Java版这里 Python版戳这里 帮女朋友舍友写 ...

  6. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈 Java版戳 ...

  7. 南邮linux期末考试试题,南邮操作系统试卷及答案.doc

    . . 装 订 线 内 不 要 答 题自 觉 遵 守 考 试 规 则,诚 信 考 试,绝 不 作 弊 装 订 线 内 不 要 答 题 自 觉 遵 守 考 试 规 则,诚 信 考 试,绝 不 作 弊 1 ...

  8. 合集 | 南邮实验报告目录

    南邮实验报告目录 南邮各种学科编程类实验程序 数据结构 南邮数据结构实验1.1:顺序表的相关操作 南邮数据结构实验1.2:带表头结点单链表的相关操作 南邮数据结构实验1.3:带表头结点单链表的逆置 南 ...

  9. 南邮计算机实验报告合集【非常全】

    南邮计算机实验报告合集 GitHub上自取,可以借鉴,请勿直接抄袭 南京邮电大学数据结构实验,南京邮电大学离散数学实验,南京邮电大学操作系统实验,南京邮电大学电工电子基础实验B实验,南京邮电大学汇编语 ...

最新文章

  1. 多语言php,多语言 · ThinkPHP5.0完全开发手册 · 看云
  2. 解决Please choose a writable location using the '-configuration' command line option
  3. python文字游戏 生成数字菜单_python自学日记5——文字游戏
  4. 领域应用 | 为电商而生的知识图谱,如何感应用户需求?
  5. Win10本地账户怎么更改为Microsoft账户
  6. 英特尔全部cpu列表_Debian发布安全更新 以修复近期披露的英特尔MDS安全漏洞
  7. 暑期训练日志----2018.8.25
  8. bzoj2752 高速公路
  9. C++基础与深度解析第二章:对象与基本类型
  10. python权威指南 pdf_Python高级编程(第2版) 中文完整pdf扫描版[76MB]
  11. 13、MVC 设计思想
  12. 八皇后问题-python描述
  13. 左耳朵耗子:云原生时代的开发者应具备这5大能力
  14. PS大神最全脑洞合集
  15. 小米平板2 Windows刷回MIUI9线刷教程(2019)
  16. 亿阳信通南宁 java笔试_亿阳信通面试笔试题及答案
  17. vue给html加背景图,Vue背景图如何全屏显示
  18. 概念:蓝筹主板创业板新三板科创板
  19. 第五章 软件项目成本管理
  20. BR/EDR控制器: 基带规范(Baseband Specification)

热门文章

  1. 《写给大家看的设计书》,推荐给想了解设计的程序员
  2. 关注你要的结果,而不要在意别人的态度
  3. Rego不好用?用Pipy实现OPA
  4. 单片机学习笔记————51单片机实现主机的串口收发
  5. 国际航线运费暴增5倍;亚马逊开店也有重大变化;亚马逊云科技推出新存储卷…|跨境电商
  6. Linux内核:进程管理——补丁管理
  7. 书海无涯,如何是好?
  8. Android 归属地查询手机号码
  9. 恕瑞玛服务器维护,恕瑞玛 - 英雄联盟官方网站 - 腾讯游戏
  10. EPSON-300K+打印机