模拟文件系统多级含源代码.docx
《模拟文件系统多级含源代码.docx》由会员分享,可在线阅读,更多相关《模拟文件系统多级含源代码.docx(58页珍藏版)》请在冰豆网上搜索。
模拟文件系统多级含源代码
内含源代码,不懂可以XX消息给我
多级文件目录管理
实训报告
--FileManager
院别:
计算机学院
姓名:
LDY
学号:
20110040xxxxxx
班级:
计Y11x
广西科技大学大学计算机学院Creationtime:
2013-1-817:
44:
25
1实验目的
本次实训的总体目的在于通过系统的编程训练,培养学生编写一个具有一定难度的小型系统的能力,培养学生从编写单个程序,实现单个程序功能到进行系统开发,整体调试的能力。
从知识点的角度来说,目的在于通过本实训项目,让学生对链表或二叉树这一重要数据结构的运用更加熟练。
2实验内容
2.1实验题目:
树状多级文件目录管理系统
本次实训的题目是树状多级文件目录管理系统。
要求利用数据结构的知识,采用链表的形式或通过将树转换为二叉树的概念,采用孩子兄弟二叉树的方式实现文件目录系统。
不容许采用数据库实现文件管理。
每个树结点表示一个文件(包括目录文件),成员基本信息可包含,文件名、文件属性、文件大小、文件创建时间,文件最后修改时间、文件最后访问时间等信息。
具体属性自行确定(注意:
成员基本信息尽量与Window系统中文件具有的属性信息相同,以便对文件进行磁盘存取时保证文件的属性信息不丢失)。
2.2实验要求:
功能实现
要求实现的总体基本功能包括:
文件的创建和删除;
文件夹的创建和删除;
文件的读写和执行;
文件的层次化显示;
打开和关闭文件;
显示目录下的文件;
查找给定文件和目录;
根据给定属性对文件进行排序;
选做功能包括:
将内存中的多级文件系统存储到磁盘中,将磁盘中某目录下的文件系统读入系统并回购多级目录系统。
3设计分析
3.1数据结构分析:
树形目录的存储、删除及树的显示
3.1.1存储结构:
采用孩子兄弟二叉链表存储方式
孩子兄弟表示法:
又称二叉树表示法,或二叉链表表示法。
即以二叉链表作树的存储结构。
链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild域和nextsibling域。
-----树的二叉链表(孩子-兄弟)存储表示-----
typedefstructCSNode{
ElemTypedata;
structCSNode*firstchild,*nextsibling;
}CSNode,*CSTree;
图3.1树的孩子兄弟表示方法实例
图3.2是图3.1中的树的孩子兄弟链表。
利用这种存储结构便于实现各种树的操作。
首先易于实现找结点孩子等的操作。
例如:
若要访问结点x的第i个孩子,则只要先从firstchild域找到第1个孩子结点,然后沿着孩子结点的nextsbling域连续走i-1步,便可找到x的第i个孩子.当然,如果为每个结点增设一个PARENT域,则同样能方便地实现PARENT(T,x)操作。
R
A
B
C
D
E
F
B
C
图3.2图3.1的孩子兄弟表示
3.1.2基于二叉表的操作:
新建、删除和显示等
·新建(父目录指针为函数参数)
·目录为空,在父目录的左孩子新建节点
·目录不为空,在父目录下的最后兄弟(最后创建时间)新建节点挂在最后兄弟右兄弟上。
根目录root
2
1
新建节点:
目录为空,放到双亲节点的左孩子
3
新建节点:
目录不为空,放到同目录最后创建的的节点的右兄弟节点中
4
新建节点:
同目录新建,同上
父目录左孩子指针
同层次右兄弟指针
同层次右兄弟指针
图3.3孩子兄弟存储:
新建文件夹/文件数字表示创建顺序
实现:
传递上级目录节点(父节点),判断父节点左孩子是否为空,为空则生成左孩子,不为空,则沿着左孩子的右兄弟寻找(将右兄弟作为链表移动到最后一个节点),直到遇到为最后兄弟,生成一个右兄弟挂在最后兄弟上。
·删除(销毁)
·单个文件,直接删除节点,释放内存
·文件夹,删除文件夹下内容,注意要释放内存。
根目录
删除第一个节点:
将左孩子树全部删除后(若为文件夹),删除本身,最后将右兄弟连接到双亲的左孩子上
删除文件夹:
先删除左孩子d,再删除本身,将右兄弟e连接到左兄弟b上
删除文件:
直接删除
d
c
a
b
e
图3.4孩子兄弟存储:
删除文件夹/文件
实现:
传递上级目录节点(父节点),判断父节点左孩子是否为空,为空时不用处理,不为空时用提供的名字(其它信息),在右兄弟组成的链表中(只看该目录下右指针相连的节点)寻找到要删除节点。
以父目录指针的左孩子指针为链表第一个节点遍历,有两种情况:
1第一个节点恰是删除节点
判断该节点左孩子指针是否为空,为空则说明这是文件或文件夹下无内容,直接删除(释放内存),将右指针挂到父目录左孩子上。
2第二个节点不是删除节点
继续往该节点右指针遍历,找到节点后判断该节点左孩子指针是否为空,为空则说明这是文件或文件夹下无内容,直接删除(释放内存),将右指针挂到上一个节点上。
补充文件夹删除方法:
采用后序删除,将删除节点的指针传递到递归后序删除函数,能将其下节点全部释放内存,最后将本身删除。
(注意保存该节点的上一个兄弟和下一个兄弟,如果有)
·显示:
主要是二叉树的遍历问题
引例:
于下图的一棵孩子兄弟二叉树
图3.5二叉树的显示
树形式表示
根目录
e
a
b
d
c
f
第一层次
第三层次
第四层次
图3.6图3.5形成的树
·层次显示:
给出文件夹节点,遍历该节点右兄弟连接形成的单链表
·第一层次(根目录层次,无分支情况):
给出根节点,左孩子节点作为该目录下第一个文件夹/文件,沿着其找遍右兄弟,直到不存在右兄弟为止(NULL)
·第二层次(上图中,有三种分支):
对于对于根目录下每个兄弟节点分别作为根节点,若存在左孩子,重新找遍节点下的右兄弟,直到找不到为止
·第三层次:
同上
····
注意:
应当是每次都只能显示一个层次中某一目录(一个文件夹)下全部内容
实现:
给出一个文件夹作为目录根节点,判断其是否存在左孩子,存在则沿着左孩子的右兄弟链显示。
·查找(关键在于取得其在树中的路径)
遍历查找:
递归先序查找关键字,找到后,列出属性等信息。
其中获得其路径方法:
1查看双亲,自己是否是左孩子,若是,保存双亲名字,返回上一级,查看它的双亲是左孩子吗,是,则保存保存双亲的双亲,一路返回判断,直到遇到树根为止。
(我没实现)
2·path:
path作为文件/文件夹的结构体的一个成员,保存的是每个节点的路径位置,因为生成节点时传递的是其上级父目录,而其父目录的路径path加上本身名字就是新节点的path,这是在生成时决定的,path在以后用处很多。
3·parent:
parent作为文件/文件夹的结构体的一个成员,保存的是每个节点的上级目录名字,不断返回将全部parent连接便是该节点路径。
·目录返回:
总体思想是用栈保存当前目录,保证在层次间来回处理文件夹。
(已实现)
·返回上级目录
出栈上级目录
·选择下级目录
入栈当前目录
3.2数据结构定义
3.2.1文件夹/文件结构定义:
folder/filestructure
structureFolder/File{
name;
attribute;
size;
creationTime;
editTime;
finalAccessTime;
path;
fileParent;
leftChild;
rightBrother;
}folder,file,pointer;
·name
变量:
名字
类型:
charname[NAMESIZE];
·attribute
变量:
属性
类型:
unsignedintattrib;
-----使用的是系统定义属性:
unsignedattrib-----
·_A_ARCH(存档)
·_A_HIDDEN(隐藏)
·_A_NORMAL(正常)
·_A_RDONLY(只读)
·_A_SUBDIR(文件夹)
·_A_SYSTEM(系统)
·size
变量:
大小
类型:
longsize;
·creationTime;
变量:
创建时间
·editTime;
变量:
修改时间
·finalAccessTime
变量:
最后访问时间
类型
timestructure
structtime{
intyear;
intmonth;
intday;
inthour;
intminute;
intsecond;
}
·path
变量:
路径
类型:
charpath[PATHSIZE];
说明:
类似windows中的‘位置’,在创建时,将上级路径与本身名字连接格式成串
·fileParent
变量:
父母
类型:
File/folderstructurepointer
说明:
出于确定路径的考虑,要想得到某文件夹/文件路径,只需向上获得双亲名字,但实际没有用到
·leftChild
变量:
父母
类型:
File/folderstructurepointer
说明:
指向左孩子的指针
·rightBrother
变量:
父母
类型:
File/folderstructurepointer
说明:
指向右兄弟的指针
3.2.2保存当前目录栈结构定义:
stackforstorecurrentdirectorpointer
structurestack{
currentHander;
top;
bottom;
}
·currentHander
变量:
当前指针
类型:
file/folderstructurepointercurrentHander[STACKSIZE];
说明:
保存目录的堆栈
·top
变量:
栈顶
类型:
inttop;
·bottom
变量:
栈底
类型:
intbottom;
3.2.3信息结构定义:
messagestructure
structuremessage{
MsgType;
}
·MsgType
变量:
消息
类型:
unsignedintMsgType;
说明:
模仿windows消息驱动机制的
-----消息类型定义-----
·messagedefinition
·Dealwithfile//处理文件夹/文件
defineNEWFILE0X006
defineNEWFOLDER0X007
defineDELETEF0X008
defineDISPLAY0X009
defineSEARCH0X00A
·Jumpinstruction//处理文件夹进入返回
defineBACK0X00B
defineFORWARD0X00C
·Readorwritefile//处理文件读写
defineREADFILE0X00D
defineWRITEFILE0X00E
·WriteorreadDISC//处理磁盘读写
defineWDISC0X00F
defineRDISC0X010
·Exit//处理程序退出
defineHALF0X011
·waitforinstrutios//程序