模拟文件目录系统-CatalogTree

使用树结构实现一个简单文件目录系统的模拟程序

数据结构:目录树CatalogTree

代码地址:Tcoder-l3est/DataStructureCourseProject: 山东大学数据结构课设 (github.com)

基础数据结构

使用的数据结构是

带父节点指针的二叉树—兄弟链表

每个节点是一个目录项,每个叶节点是一个文件(也有可能是空目录)。

示意图

结点结构

struct Node
{Node* parent;//每个节点都要记录父节点Node* LeftChild;//只记录第一个孩子Node* sibiling;//平级向后连int file_type;//0文件 1目录string file_name;//文件或者目录名字ll fnum;//子文件数目ll file_size;//该文件大小//针对目录文件来说的ll all_mx;//目录配额 和 后代配额ll son_used;//所有的孩子占的大小char power;//权限Node(int type, string fname, ll size = 0) {file_type = type; file_size = size;fnum = 0;parent = NULL; LeftChild = NULL;sibiling = NULL;file_name = fname;all_mx = 0;son_used = 0;power = 'p';//r是管理员权限}~Node() {  }bool pre_add_size(ll size) {//预分配 文件if (all_mx && son_used + size > all_mx)return false;return true;}void add_size(ll size) {//预分配成功才进入这个son_used += size;}void get_size() {if (file_type == 0) {cout <<"文件大小: "<<file_size<<"\n";//文件}else{cout << "目录配额大小: " << all_mx << " 使用了 " << son_used << "\n";}}bool set_size(ll all) {//分配一个配额 只对目录有用if (all < son_used) return false;return true;}};

定义指针指向父节点、左孩子、兄弟节点

定义文件或者目录名字,以及类型

针对目录文件:实现带配额的也就是模拟磁盘大小的功能,添加了目录配额**all_mxall\_mxall_mx**

以及所有孩子占的磁盘大小 son_usedson\_usedson_used

**powerpowerpower**实现角色的权限控制

树结构

class CatalogTree
{
private:Node* root;Node* CurNode;//当前位置char my_power;
public:CatalogTree();~CatalogTree() { delete root; };string outname;string inname;ifstream ffin;ofstream ffout;int put_flag;//输出在cmd 还是 file//基础void dir();//列出当前目录下的所有子目录和文件项void cd();//累出当前目录的绝对路径void cd_recur(Node* now);void cd_back();//当前目录变为当前目录的父目录。void cdstr(string& str);//当前目录变为STR所表示路径的目录void mkdir(string& str);//在当前目录下创建一个子目录str,如果存在则不进行任何操作void mkfile(string& str);//在当前目录下创建一个文件,若存在不进行。void delet(string& str);//删除当前目录下名字为STR的目录或者文件,如果不存在,不进行操作void deletenode(Node* now);void save(string& str);//将从根节点开始的目录树结构保存到文件中void save_recur(ofstream& fout, Node* now, int depth);//递归保存void load(string& str);//从文件STR中读取之前保存的目录树结构,并且根据其重新建立当前的目录树void load_recur(ifstream& fin, int depth);void read_data(int num);//sizevoid mkfile_size(string& str, ll size);//make file with 大小限制  str相对路径void setdir_size(ll all_mx);//给当前 原有的 目录文件设置配额void remove_size(string& str);//删除文件或者目录//其他void cd_root();//回到rootvoid mkdir_p(string& str);//自行创建多层目录void put_size() { CurNode->get_size(); }//获取当前目录的配额//权限void _r() { my_power = 'r'; }void _p() { my_power = 'p'; }void mkdir_r(string& str);//创建带权限的目录void mkfile_r(string& str);//创建带权限的文件void delet_r(string& str);//拓展文件操作//剪切void mv_a2b(string &a,string &b);//从a移动到b//复制void cp_a2b(string& a, string& b);//把当前目录下的a 复制到b下 b下不能有重名的void cp_r(Node *t);//递归拷贝节点
};

私有成员

​ 包括根节点、定义了一个CurNodeCurNodeCurNode来表示当前正在哪个目录下,哪个节点中,以及一个my_power 来检查处于文件系统的角色的权限是什么样的。

公有成员

​ outname、innameoutname、innameoutname、inname是用来输入输出的,配合ffin和ffoutffin和ffoutffin和ffout使用,putflagput_flagputf​lag是决定输出在cmdcmdcmd 还是$ file$


实现了以下指令:

基础

  • dir —— 列出当前目录下的所有子目录与文件项,所有文件项后加*表示“这是一个文件”,没有则不输出;

  • cd —— 列出当前目录的绝对路径

  • cd .. —— 当前目录变为当前目录的父目录 。

  • cd str —— 当前目录变为 str 所表示路径的目录。

  • mkdir str ——在(当前目录下)创建一个子目录(名为 str),若存在则不进行任何操作。

  • mkfile str ——在(当前目录下)创建一个文件(名为 str) ,若存在则不进行任何操作。

  • delete str ——删除(当前目录下)名为 str 的目录或文件,若不存在则不进行任何操作。

  • save str—— 将从根节点开始的目录树结构保存到文件(名为str)中。

  • load str —— 从名为的文件str中读取之前保存的目录树结构,并根据其重新建立当前目录树,并进行后续操作

  • quit —— 退出程序

拓展

权限操作:
  • -r —— 系统权限变为root

  • -p—— 系统权限变为p

  • mkdir-r—— 创建一个权限为R的目录

  • -mkfile-r str—— 当前目录下创建一个名为str目录,权限为r

  • -delete-r str—— 以root权限,删除当前目录下名为str的目录或文件

配额操作:
  • mkfile-s str—— 在当前下创建大小为size,名为str的文件

  • Q size—— 在当前下创建大小为size,名为str的文件

  • remove str—— 删除绝对路径str最后一个文件以及目录

  • show—— 展示当前目录的配额大小以及使用情况或文件的大小

文件操作:
  • mv a b—— 把当前路径下的a剪切到绝对路径b下

  • cp a b—— 把当前路径下的a复制到绝对路径b下

其他操作:
  • mkdir-m str—— 根据输入的str绝对路径,生成多级目录(类似于touch)

部分实现思路

基础

void dir()的设计思路:

列出当前目录下的所有子目录和文件项,只需要对当前路径的子节点扫描一遍输出即可。void cd()的设计思路:

列出当前目录的绝对路径,需要递归实现,首先迭代到根节点,开始输出文件名称,之后递归回来,就完成了路径的输出!

void cd_back()的设计思路:

进入当前路径的父节点即可实现后退操作。

Void cdstr(string& str)的设计思路:

当前目录变为STR所表示路径的目录,首先判断是绝对路径还是相对路径,绝对路径从根开始进入即可,相对路径返回父节点后再进入就行。

void mkfile/mkdir(string& str)的设计思路:

当前目录下创建一个目录或者文件节点,只需要先检查是否已经存在该种目录或者文件,如果没有则新建节点,设置大小后,插入即可。

void delet(string& str)的设计思路:

删除当前目录下名字为STR的目录或者文件,如果不存在,不进行操作.

先扫描找到该节点,之后如果是文件直接删除并且修改指针,如果是目录就递归删除,所有子目录子文件.

void save(string& str)的设计思路:

将从根节点开始的目录树结构保存到文件中,借鉴windows里面 tree命令,进行递归存储,即从根节点开始,如果有目录就进入目录递归保存,根据不同的level 前面加不同个’|’ 来标志,如果是目录则储存为 |后加’-’表示为目录.

最后保存CUR表示当前节点,之后存END表示结束标识符

下图是windows Tree命令 以及 模拟的Tree命令

void load(string& str)的设计思路:

从文件读入 把目录树建立起来,与load思路相同,最后要设置curnode扫描节点,读到cur设置curnode,读到end停止。

拓展

文件操作拓展

void mv_a2b(string &a,string &b)的设计思路:

​ 进行剪切文件的操作,传入当前目录下的一个文件或者目录a 然后绝对路径b,把a移动到b下面,如果是根则不能移动,如果有权限不符合的则直接返回权限不够。文件可以直接移动,目录递归移动,不需要删除源节点,只需要对指针进行修改。

一定要拒绝父节点 剪切到子节点的操作!

void cp_a2b(string& a, string& b) 的设计思路:

​ 进行文件的复制操作,把当前目录下的a 复制到b下 b下不能有重名的,文件直接复制,目录递归复制,如果是根则不能复制,如果有权限不符合的则直接返回权限不够,最后不能简单修改指针,不然会导致紊乱,必须要新建节点。

权限拓展

void mkdir_r/mkfie_r(string& str)的设计思路:

创建一个权限为r(root)的目录、文件,如果当前权限不为r则无法删除 或者进行其他操作。

void delet_r(string& str)的设计思路:

利用以管理员身份删除对应文件或者目录。

配额拓展

void mkfile_size(string& str, ll size)设计思路:

在当前路径下创建一个大小为size的文件,需要检查是否满足文件大小配额要求,所以需要检查当前目录结构是否有足够的空间。其次检查是否有重复文件。建立完成之后,加入该文件并且修改对应的目录的配额剩余。

void setdir_size(ll all_mx)思路:

给当前 原有的 目录文件设置配额,必须要满足当前文件是目录文件并且分配的配额大小满足最小的文件限制,否则就分配不成功。

void remove_size(string& str)设计思路:

先检查删除的是文件还是目录,文件的话直接删除,并且修改目录的配额即可。

如果是目录,则需要修改父目录的配额,并且递归删除所有文件、目录。

其他拓展

void cd_root()的设计思路:

回到根目录

void mkdir_p(string& str)的设计思路:

对于输入的绝对路径,如果走到了现在目录的最后一个目录仍有路径没有走完,则自动创建对应的目录,自动实现多层目录的访问以及补全。

void put_size()

获取当前目录的配额


分析

时间复杂度

对于从根向下进行搜索的操作的复杂度都是平均O(logn),最差O(n)即一个链表的情况。

对于递归的操作则是O(n) 因为要对所有节点进行操作。

要修改父目录的配额,并且递归删除所有文件、目录。

其他拓展

void cd_root()的设计思路:

回到根目录

void mkdir_p(string& str)的设计思路:

对于输入的绝对路径,如果走到了现在目录的最后一个目录仍有路径没有走完,则自动创建对应的目录,自动实现多层目录的访问以及补全。

void put_size()

获取当前目录的配额


模拟文件目录系统-CatalogTree相关推荐

  1. 空间管理员(一)AFS文件目录系统索引节点vfs_inode结构

    空间管理员(一)AFS文件目录系统索引节点vfs_inode结构 文章目录 空间管理员(一)AFS文件目录系统索引节点vfs_inode结构 前言 一.VFS(Virtual File System) ...

  2. OS课设:实现二级文件目录系统

    先从头才是撤,写到现在真的感觉是令人肝疼的一份课设.2019年6月27日19:16:09 老师就不说了,在站内可以直接搜到,所以还是悄悄地抱怨,WOC XiaoZhao 废话不多讲了,开始这份分析报告 ...

  3. phpemspro模拟考试无试题_GitHub - BoobooWei/phpems: 基于开源免费的PHP无纸化模拟考试系统phpems 6.0优化,适配php7.3。...

    开源免费的PHP无纸化模拟考试系统,基于 PHPEMS v6.0 优化.本版本重点修复BUG(包括所有非 E_NOTICE 级别错误提示),并根据需要优化新增一些功能.如果要使用旧版本请参考 PHPE ...

  4. java实现模拟考试系统,基于jsp的驾照模拟考试系统a-JavaEE实现驾照模拟考试系统a - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的驾照模拟考试系统a, 该项目可用各类java课程设计大作业中, 驾照模拟考试系统a的系统架构分为前后台两部分, 最 ...

  5. 计算机基础及ms office应用,全国计算机等级考试一级计算机基础及MS Office应用模拟练习系统...

    全国计算机等级考试一级计算机基础及MS Office应用模拟练习系统是一款计算机一级考试模拟软件.软件按照<全国计算机等级考试最新考试大纲>研制而成,汇聚了多年开发全国计算机等级考试模拟软 ...

  6. php在线模拟高考志愿,高考志愿模拟填报系统

    出国留学高考网为大家提供吉林省2018高考志愿模拟填报系统,更多高考资讯请关注我们网站的更新! 吉林省2018高考志愿模拟填报系统 填报时间 5月26日至28日(每天09:00至15:00). 模拟范 ...

  7. php在线考试系统模板下载,PHPEMS在线模拟考试系统 v6.1

    PHPEMS在线模拟考试系统主要用于构建在线考试系统,如驾照.英语等练习系统. 一.系统功能: 1.强化训练测验,对知识点进行单独联系 2.随机组卷练习,系统自动抽取题目进行练习 3.手工组卷联系,通 ...

  8. 模拟导入系统通讯录5000+手机号 校验大量数据处理

    模拟导入系统通讯录5000+手机号 校验大量数据处理 之前再测试一个导入手机通讯录系统时,随机抽了几个人的手机进行了测试,都导入显示正常 当公司BD进行项目试用时,导入通讯录一直处于下图加载中 1.于 ...

  9. 模拟线性调制系统的仿真

    一.实验目的 1.假设对模拟调制系统基本原理和基本组成的理解 2.熟悉调制和解调过程中信号时域和频域特性的变化过程 二.实验原理 1.AM调制: (1)具有离散大载波的双边带调幅又称标准调幅,正弦型载 ...

最新文章

  1. 如何在文件夹中运行cmd命令行
  2. 查看自己生日是否在pi中
  3. golang go build 报错 import cycle not allowed
  4. c++ 在哪里找文档来看_FPX双C十四连败引热议!Doinb:我再也不跟LWX双排了
  5. 郑州尚新科技--J2EE考试题
  6. 工作中让你提建议怎么办?
  7. 常用文献管理软件使用经验
  8. Spring-boot 打成jar包后使用外部配置文件
  9. java独步寻花,小班语言《江畔独步寻花》
  10. Flink keyby 数据倾斜问题处理
  11. 深搜和广搜--原理彼此的优缺点
  12. 浅谈php的抽象类和接口类
  13. 数学建模安装matlab,数学建模神器——Matlab下载安装教程
  14. 视频分辨率全表(101种)
  15. zyf整合ssm环境
  16. 虚拟云服务器能调用本地摄像头,云服务器本地摄像头
  17. 2017年大工考博英语加试试题。给学弟学妹们一点帮助
  18. Java中的多态,引用类型的转换
  19. 矩阵理论及其应用课后习题作业:第五章 第六章
  20. 每次合上笔记本总是进入待机或休眠

热门文章

  1. 基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB
  2. matlab从csv文件中读取时间转换异常
  3. C# GroupBy 用法
  4. Spring Boot开发介绍
  5. Ranked List Loss for Deep Metric Learning | 阅读笔记
  6. Excel 当前行高亮
  7. 2017年性骚扰案件频频曝光,硅谷首当其冲
  8. Android 计算时间差
  9. 衡水中学2021年的高考成绩查询,2021年全国百强高中排名,它拥有90%一本升学率,超衡水中学成第一...
  10. 史上最全最精美的ppt模板,这里有2000多套ppt,涵盖了各行各业的ppt类型,不管是在校用还是工作用,这里面都有!