为Linux系统设计一个简单的二级文件系统。要求做到以下几点:
(1)可以实现下列几条命令
dir列文件目录
create创建文件
delete删除文件
open打开文件
close关闭文件
read读文件
write写文件
(2)列目录时要列出文件名、物理地址、保护码和文件长度;
(3)源文件可以进行读写保护。
二、实验设计原理:
(1)本题使用的数据结构:
磁盘结构体:
typedefstructdiskList
{
intmaxlength;//磁块的大小
intstart;//磁块的起始地址
intuseFlag;//标志该磁块是否已使用过
char*text;//存放的文件内容
distList*next;
}diskNode;
文件结构体:
structfileList
stringfilename;//文件名
intstart;//物理地址
intlength;//文件长度
intmaxlength;//文件的最大长度
charfileKind;//文件类型:只读0只写1读写2
charprotect;//保护码
boolopenflag;//打开标志,当为true时标志该文件正打开
};
子目录结构体:
typedefstructUserFileDirectory
fileList*file;//连接文件
UserFileDirectory*next;//连接用户目录项
}UFD;
主目录结构体:
typedefstructMasterFileDirectory
stringusername;
stringpassword;
UFD*user;//连接用户目录项
}MFD;
(2)本题主要符号说明:
类型
名称
说明
diskNode*
diskHead
磁盘链表头指针
MFD
User[]
主目录集合
int
MaxUser
最大用户数
Used
已有用户数
NowUser
当前用户
string
Now_Filename
当前正在使用的文件名
bool
FileOpen
当前是否有已打开文件
(3)本题主要函数说明:
void
FreeSpace
释放整个文件系统使用到的链表指针
Initdata
初始化主要数据
userCreate
为文件系统创建用户
login
requestDisk
请求分配存储磁块
fileCreate
创建文件
freeDisk
释放文件所占的磁块
fileDelete
删除文件
fileRead
读取文件内容
filewrite
往文件写入内容
fileclose
关闭文件
fileopen
打开文件
SaveData
保存主目录、子目录和已创建的文件
fileDir
列文件目录
GetUser
获取当前正在使用系统的用户名
(4)程序流程图:
五、实验结果与分析:
初始界面:
首先输入user命令为文件系统创建用户并使用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再创建新的子目录了吗,这样的话题目应该写为实现树形文件目录系统,而不是二级文件目录系统了。我认为这样的操作违背了二级文件系统的逻辑结构。所以我在实现的过程中创建用户就自动为文件分配了文件目录项,文件目录项拥有指向下一个文件目录项的指针和指向文件的指针,具体结构如图所示(此图为引用)
根据题目我所理解的源文件可以进行读写保护的意思是:创建文件时可以规定该文件为只读、只写和读写三种类型的文件。当用户在文件系统想要对只写文件进行读操作时是不允许的,同理当用户想对只读文件进行写操作时也是不允许的。这是我所理解并实现的读写保护功能。
面对老师的严格要求,我也在很大程度上提升了对自己的要求,力保自己所理解的题意和要求是正确的,不走到弯路跑偏。通过本次课程设计模拟开发了一个小系统,我学到了很多,不仅仅是操作系统这门课上的知识内容,更是程序开发的方方面面的细节,前期准备、中期实现、后期维护,每一步都要为全局考虑,既保证成功实现,也保证逻辑结构紧密,可维护性强,代码清晰易懂等。同时也提高了我的自信心,想做,去尝试,就一定能做到!
五、存在问题及改进:
在后期的话还可以对该文件系统进行可视化,包装成一个软件,将通过该软件创建的文件存储在一个隐秘的地方,只有通过该软件才能对文件进行操作等对用户私人化处理,打造一个私人文件系统。
六:实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。