模拟文件系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统大型试验
实
验
报
告
姓名:XX
班级:软件工程110x
学号:201126630xxx
一、名称
操作系统大型试验。
二、目的
用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。
三、要求
开发工具:word,vc win32api
1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储
2.文件系统的目录结构采用类似Linux的树状结构;
3.要求模拟的操作包括:
a)目录的添加、删除、重命名;
b)目录的显示(列表)
c)文件的添加、删除、重命名
d)文件和目录的拷贝
4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明
5.用户输入exit时退出该系统
6.实验实现基于windows平台;
7.实验开发语言可以选用C/c++等
四、设计
1.主要思路说明
本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。搜索空白物理盘块时采用顺序搜索物理盘块数组。存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。
本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创!
2.申优功能:
1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。
2)能实现级联删除,即当删除目录(文件夹)时,目录下的所有内容也应当删除并正确释放物理盘块空间。
3)能实现目录的复制,即复制目录时(文件夹)时,该目录下的所有文件和目录也应准确复制至目标目录中,并正确分配物理盘块空间。
3.主要函数和类的定义
1)主要函数定义
#define show_bnum 20 //显示物理盘块的块数
#define block_size 1024 //物理盘块块数
int block[block_size]; //假设有block_size块物理盘块
string content[block_size]; //存放文件内容
int Msize=5; //此处为模拟磁盘大小为输入5个字符fnode *root=new fnode("WP:",0,0); //设置根目录
fnode *current_path=new fnode(); //当前路径
fnode *seek_flag=new fnode(); //作为查找标志
fnode *cp_flag=new fnode(); //作为复制的位置标志
void initialize(); //初始化
int seekTarget(string name); //搜索文件或目录
int seek_log(string name); //搜索目录
void delete_node(string name); //删除节点
int freeblock(fnode *); //释放物理盘块
int seekfreeblock(); //搜索可用物理盘块
void show_current_path(); //显示当前路径
void add_file(string name,int t); //增加目录、文件
void show_curpath_all(); //显示当前目录下的所有文件void rename_file(string Oname,string Nname); //重命名
void seperate(); //分离命令
void cd(); //进入目录
void add_File(); //增加文件功能入口
void add_Log(); //增加目录功能入口
void delete_file(); //删除文件或目录功能入口void show_memory(); //显示物理盘块占用情况void re_name(); //重命名功能入口
void help(); //查看帮助
void show_content(); //查看文件内容
void write_file(); //写文件
void Clear_(); //清屏
void Exit(); //退出
void cp(); //复制功能入口
void cp_log(fnode *target,fnode *source); //复制目录
void cp_file(fnode *target,fnode *source); //复制文件
void cp_node(fnode *target,fnode *source); //复制节点
int find_target_log(); //找到复制的目标目录
int calculate_logsizeMain(fnode *); //计算目录大小
int calculate_logsize(fnode *);
2)文件节点类的定义:
class fnode
{
public: