操作系统
课程设计报告
一、 实验内容:
模拟文件管理系统
为Linux系统设计一个简单的二级文件系统。要求做到以下几点:
(1)可以实现下列几条命令
login 用户登录
dir 列文件目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
(2)列目录时要列出文件名、物理地址、保护码和文件长度;
(3)源文件可以进行读写保护。
二、 实验设计原理:
(1)本题使用的数据结构:
磁盘结构体:
typedef struct diskList
{
int maxlength;//磁块的大小
int start;//磁块的起始地址
int useFlag;//标志该磁块是否已使用过
char* text;//存放的文件内容
distList* next;
}diskNode;
文件结构体:
struct fileList
{
string filename;//文件名
int start;//物理地址
int length;//文件长度
int maxlength;//文件的最大长度
char fileKind;//文件类型:只读0 只写1 读写2
char protect;//保护码
bool openflag;//打开标志,当为true时标志该文件正打开
};
子目录结构体:
typedef struct UserFileDirectory
{
fileList* file;//连接文件
UserFileDirectory* next;//连接用户目录项
}UFD;
主目录结构体:
typedef struct MasterFileDirectory
{
string username;
string password;
UFD* user;//连接用户目录项
}MFD;
(2)本题主要符号说明:
类型 |
名称 |
说明 |
diskNode* |
diskHead |
磁盘链表头指针 |
MFD |
User[] |
主目录集合 |
int |
MaxUser |
最大用户数 |
int |
Used |
已有用户数 |
int |
NowUser |
当前用户 |
string |
Now_Filename |
当前正在使用的文件名 |
bool |
FileOpen |
当前是否有已打开文件 |
(3)本题主要函数说明:
类型 |
名称 |
说明 |
void |
FreeSpace |
释放整个文件系统使用到的链表指针 |
void |
Initdata |
初始化主要数据 |
void |
userCreate |
为文件系统创建用户 |
int |
login |
登录系统 |
int |
requestDisk |
请求分配存储磁块 |
void |
fileCreate |
创建文件 |
void |
freeDisk |
释放文件所占的磁块 |
void |
fileDelete |
删除文件 |
void |
fileRead |
读取文件内容 |
void |
filewrite |
往文件写入内容 |
void |
fileclose |
关闭文件 |
void |
fileopen |
打开文件 |
void |
SaveData |
保存主目录、子目录和已创建的文件 |
void |
fileDir |
列文件目录 |
string |
GetUser |
获取当前正在使用系统的用户名 |
(4)程序流程图:
五、实验结果与分析:
初始界面:
首先输入user命令为文件系统创建用户并使用login命令登陆刚才创建的用户:
用户登录成功,login命令成功实现。
先查看本地文件夹:
可以看到除了编译文件和源程序之外是没有其他文件的
下面使用creat命令创建两个文件,分别是aaa,bbb,其中aaa为只读文件,bbb为读写文件:
可以看到命令完成后本地文件夹成功创建两个文件。
下面执行dir命令查看文件信息:
其中物理地址我没有按照提示那样去设定,我是这样设定的:每个文件创建的时候会有分配长度,系统根据输入信息分配一个相同大小的物理磁块作为文件的内容存储空间,文件的物理地址就是其所在磁块的起始地址。保护码的设定为读写权限的指令标志,即0为只读文件,2为读写文件。
下面使用open命令打开文件:
注意,如果文件没有提前open就执行read读操作或者write写操作视为非法操作。
比如下:
open文件aaa:
使用write命令对文件aaa写入数据。
可以看到,我们在创建aaa文件时指定的是只读文件,无法进行写操作,这就是读写保护。
我们先使用close命令关闭当前打开的文件aaa,再使用open命令打开可读写文件bbb。
先在本地查看bbb文件的内容:
可以看到无任何内容,然后对bbb执行write写操作:
可以看到写入成功,文件内容也发生变化!
下面使用delete命令将文件bbb删除:
可以看到,上面我们使用bbb文件后还未执行close命令关闭文件,所以无法删除,我们先close文件bbb,再执行删除:
可以看到,刚才在上一张截图中还存在的bbb已经被删除。
下面执行dir查看当前文件目录信息:
可以看见bbb已经成功被删除。
输入exit命令退出系统,会自动保存主目录及用户文件目录,形成文件,其中主目录文件MFD存放用户名称,用户目录文件名为用户名,存放该用户下创建的各个文件名。为效果明显,我在退出之前又创建了用户A、用户B,在ywd用户下多创建了文件ccc和ddd。
查看一下主目录文件MFD的内容:
ywd文件的内容:
A和B因为没有在他们下面创建文件所以内容都为空,此处就不放图。
至此,题目要求的八大功能已全部实现并演示完毕!全部都是同一时间点下的演示,每个截图最上方有日期和时间可供查看,仅有两张图片漏截时间。
五、课设收获和体会:
本次课程设计让我对二级文件系统有了很深刻的认知和理解。二级文件系统的文件路径即为/用户/文件名,题目截图中出现了mkdir的命令操作创建一个子目录,我认为这是没有必要的,每个用户的用户文件目录表只有一个,不存在多个用户文件目录表的情况,如果有了mkdir不就可以在目录下创建一个子目录,然后在新建的子目录下再执行mkdir再创建新的子目录了吗,这样的话题目应该写为实现树形文件目录系统,而不是二级文件目录系统了。我认为这样的操作违背了二级文件系统的逻辑结构。所以我在实现的过程中创建用户就自动为文件分配了文件目录项,文件目录项拥有指向下一个文件目录项的指针和指向文件的指针,具体结构如图所示(此图为引用)
此次课程设计虽为设计简单系统,但我还是坚持花了一个上午的时间在构思完整个系统的全部逻辑模块后才开始实现。在实现的过程中也遇到了很多问题,最明显的就是C++指针乱指,链式结构在编程时稍不注意就会出现这个问题,但只要每次设计到使用指针的时候多思考全面一些便可以规避这个问题,且及时将临时申请的内存空间释放掉是一个很好的编程习惯。
根据题目我所理解的源文件可以进行读写保护的意思是:创建文件时可以规定该文件为只读、只写和读写三种类型的文件。当用户在文件系统想要对只写文件进行读操作时是不允许的,同理当用户想对只读文件进行写操作时也是不允许的。这是我所理解并实现的读写保护功能。
面对老师的严格要求,我也在很大程度上提升了对自己的要求,力保自己所理解的题意和要求是正确的,不走到弯路跑偏。通过本次课程设计模拟开发了一个小系统,我学到了很多,不仅仅是操作系统这门课上的知识内容,更是程序开发的方方面面的细节,前期准备、中期实现、后期维护,每一步都要为全局考虑,既保证成功实现,也保证逻辑结构紧密,可维护性强,代码清晰易懂等。同时也提高了我的自信心,想做,去尝试,就一定能做到!
五、存在问题及改进:
本次我所开发的文件系统仅仅只是个小样,除了已有功能外,还可以考虑再实现对已保存的本地主目录、子目录和活动文件进行读取的功能,类似于加载存档的功能,这样的话在使用完系统后既可以保存创建的文件,下次用户登录系统的时候也可以继续上次的工作状态。
在后期的话还可以对该文件系统进行可视化,包装成一个软件,将通过该软件创建的文件存储在一个隐秘的地方,只有通过该软件才能对文件进行操作等对用户私人化处理,打造一个私人文件系统。
六:实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。
程序完整代码请转至个人GitHub仓库(如果喜欢,麻烦点个star✨谢谢~)
结语:随笔仅供参考,千万不要照抄哦,我相信你可以的~!