先从头才是撤,写到现在真的感觉是令人肝疼的一份课设。2019年6月27日19:16:09
老师就不说了,在站内可以直接搜到,所以还是悄悄地抱怨,WOC XiaoZhao
废话不多讲了,开始这份分析报告把,希望能帮上我的读者。
本人的底层实现来自于这位大哥的好心链接,给我了很多指导性的启发,不过他也有致命的错误,也是我为什么这么肝疼的原因了(设计实现一个文件系统,既然要以链表的形式实现连续式存储文件系统,为什么不做存储空间的回收)
附带大哥链接:https://blog.csdn.net/huangqiang1363/article/details/50592633
本人在实现:1空间分配,2空间合并,3优先排序方面真的下了很大的功夫,毕竟单链表实现连续性,实现起来确实可能不如同学使用的索引节点好用。本人的拙见……
课设题目:操作系统之实现二级文件目录系统
时间,,,乌拉乌拉
其实,刚拿到这个题目时,我真的没有思路,随后我就对着老师的课设指导书进行研究,对二级文件系统的演示这个课题的每个要求进行分析,总算是有了思路。下面给出我的分析。
文件系统演示
一、课程设计目的
使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
//既然是基于控制台的,我们可以更改颜色玩玩
二、课程设计内容
设计一个简单的多用户文件系统。即 //和后面一样,用结构体数组实现
①在系统中用一个文件来模拟一个磁盘; //switch语句或者if-else语句实现,既然这里说到了 用一个文件去模拟一个磁盘,换句话说,在你的课设里,必须要有磁盘空间分配的思路在里面,不然就不是模拟磁盘了。
②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。
③实现这个文件系统。 //文件系统要实现
④能实际演示这个文件系统。//cmd演示即可
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
三、课程设计指导
1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 //三个数组的大小分别为 10、10、5
//一次运行用户最多可以打开5个文件如何实现? 在用户文件里面加变量判断,用户每打开一个就+1,
//每次用户最多可保存10个文件如何实现? 很明显,同时保存我们是无法做到的,无论是谁,都无法做到,也就是说还是一个个保存的,那么同样可以设置变量判断。如果保存的较多,那么只好请用户单独关闭某些指定的文件。
2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。 //存放各个用户目录的文件夹、用户目录
//是说运行的所有文件用一个目录层次表示吗
3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 //整型的变量判断是否读写完成了 下面的pointer
4)因系统小,文件目录的检索使用了简单的线性搜索。 //链表的顺序查找
5)文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 //标记变量即可实现
6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图5.1所示。//主要的结构体设计
还有MFD、UFD、AFD最好全部存到文件里面去,不然每次都要输入,十分麻烦,而且不能通过看文件 查看到自己的实验现象,着实不便。
参考的数据结构设计如下
struct TYPE_UFD //用户文件目录
{
string File_Name; //文件名
bool Read; //读保护码,true为可读
bool Write; //写保护码,true为可写
bool Execute; //执行保护码,true为可执行
int Length_File; //文件长度
}; //用户文件目录和用户打开的文件目录是不是都各有自己的属性
struct TYPE_MFD //主文件目录
{
string User_Name; //用户名
TYPE_UFD *Pointer; //用户文件目录指针
};
//很明显,第三个结构体没有指针域,但我们是需要指针域的,还有下面红色部分可以合在一个整型变量里面的
struct TYPE_AFD //打开文件目录
{
int File_ID; //打开的文件号
boolRead;//读保护码,true为可读
boolWrite;//写保护码,true为可写
boolExecute;//执行保护码,true为可执行
int Pointer; //读写指针
};
7)文件系统结构如图5.2所示
//很明显,这里要用到的数据结构是 链表
8)文件系统算法的流程图如图5.3所示。
图5.3文件系统算法的流程图
//这里告诉了你 main函数的主要调用的函数顺序
9)注意对于物理块的访问(包括访问指针,空闲位)需要经过输入输出,相当于通过定位对文件进行读写。打开文件目录(AFD)是在内存中,由打开文件时创建。
好了,分析完了,就要开始编写代码了,下面附上我小小的代码,还有很多需要修改的地方,做的不好的地方,大神就请原谅,也希望多多指点我。
---------------------
作者:o0非诚勿扰0o
来源:CSDN
原文:https://blog.csdn.net/huangqiang1363/article/details/50592633
代码实现Code
下面是我实现整体结构的文件·
1 OSHead.h头文件
#ifndef OSHEAD_H_INCLUDED
#define OSHEAD_H_INCLUDED
#include<cmath>
#include<ctime>
#include<string>
#include<conio.h>
#include<fstream>
#include<cstdlib>
#include<iostream>
#include<windows.h>
using namespace std;
typedef struct UFD
{
string File_name; //文件名
int Start; //文件在磁盘存储空间的起始地址
int Protect; //文件的属性
int File_length; //文件的长度
int Max_File_length; //文件的最大长度
struct UFD *next;
int i=0;
}UFD,*UFD_ptr;
typedef struct MFD
{
string User_name;
string User_passwd;
UFD *Ufd_next;
int End;
struct MFD *next;
}MFD,*MFD_ptr;
typedef struct AFD
{
string File_name;
int File_length;
int Start;
int Protect;
int Pointer; //根据这个指针的值去完成用户的要求 读写指针
int Max_File_length;
struct AFD *next;
}AFD,*AFD_ptr;
#endif // OSHEAD_H_INCLUDED
2.Main.cpp文件
#include"OSHead.h"
#define MaxDisk 512*1024 //一个扇区512字节,假设有1024个扇区,模拟磁盘的大小
int Max_User=10;
int Max_Open=5;
int Max_End=0;
UFD_ptr pufd=NULL;
MFD_ptr pmfd=NULL;
AFD_ptr pafd=NULL;
char User_name[30]; //存放当前用户的用户名
char flag='n';
char Disk_Size[MaxDisk]; //最后在打印输出的时候,用RWX表示即可
int zone[10][2];
int x,y;
typedef struct Disk_Table
{
int Max_length; //最大长度
int Start; //开始位置
}Disk_Node;
Disk_Node Disk_Head;
void clean();
void sort();
void Init_Disk()
{
Disk_Head.Max_length=MaxDisk;
Disk_