7模拟二级文件管理课程设计报告Word格式.docx
- 文档编号:20049515
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:33
- 大小:202.71KB
7模拟二级文件管理课程设计报告Word格式.docx
《7模拟二级文件管理课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《7模拟二级文件管理课程设计报告Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
9)对于共享文件,除了文件的创建者,其他人只有查看权,不能进行写入与删除操作
10)对于文件的越权操作,要有相应的错误提示
三、系统分析与设计
1、系统分析
本次的设计的是希望通过模拟二级目录文件的管理方式来进一步了解磁盘的分配步骤和文件的调用方式,二级文件目录分别由用户文件目录UFD(UserFileDirectory)、主文件目录MFD(MasterFileDiretory)构成。
其中UFD由用户的所有文件块组成,在MFD中每个用户目录文件占用一个目录项,其中目录项中包括用户名和指向用户目录文件的指针,其基本构成如图所示:
用户名
用户密码
指向子目录指针
a
b
c
a用户文件目录FCB
a1
起始地址
文件
长度
类型
指针
a2
b用户文件目录FCB
b1
b2
①用户文件目录项的基本信息包括基本信息、地址信息、访问控制信息。
1.基本信息
◆文件名:
通常在不同系统中允许不同的最大长度。
可以修改。
有些系统允许同一个文件有多个别名;
◆文件类型:
可有多种不同的划分方法,如:
✓有无结构(记录文件,流式文件)
✓内容(二进制,文本)
✓用途(源代码,目标代码,可执行文件,数据)
✓属性attribute(如系统,隐含等)
✓文件组织(如顺序,索引等)
2.地址信息
◆存放位置:
包括哪个设备或文件卷,以及各个存储块位置;
◆文件长度:
以字节、字或存储块为单位。
可以通过写入或创建、打开、关闭等操作而变化。
3.访问控制信息
◆文件所有者(属主):
通常是创建文件的用户,或者改变已有文件的属主;
◆访问权限(控制各用户可使用的访问方式):
如读、写、执行、共享等;
在两级目录结构中,如果用户希望有自己的用户文件目录,可以请求系统为自己建立一个用户文件目录;
有了自己的UFD后,用户可以根据自己的需要创建新文件。
每当此时,OS只需要检查该用户的UFD,判定在该UFD中是否已有同名的另一个文件。
若有,用户必须为新文件重命名;
若无,便在UFD中建立新目录项,将新文件名及其有关的属性填入到目录项中,并置其状态位为1,。
当用户要删除一个文件时,OS也只需要查找该用户的UFD,从中找到指定文件的目录项,在回收该文件所占用的存储空间后,将该目录项删除。
②、文件系统中文件基本操作:
创建文件:
创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录下,为此建立一个目录项。
目录项中以链表的形式记录新文件的文件名以及其在外存的地址等属性。
删除文件:
当已不再需要某文件时,可将它从文件系统中删除。
在删除时,系统应该先从目录中找到删除文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。
文件的重命名:
根据用户的需要更改文件的名称,但更改中必须保证文件名不与相同目录中的其他文件重名。
③、文件系统的存储利用的是显示链接存储方式
文件存取:
实现“按名存取”。
即用户只需向系统提供所需访问的文件的名字,便能快速准确地找到文件在外存上的存储位置。
这是目录管理最基本的功能,也是本文件系统向用户提供的最基本的服务。
提高对目录的检索速度。
通过合理地组织目录结构的方法,可加快对目录的检索速度,而且本系统利用结构体,设置指针对于下一块的物理位置进行了指定,利用自己优化的算法,可以快速而准确的找到目标位置,从而提高了对文件的存取速度。
这是在设计一个大、中型文件系统时所追求的主要目标。
文件内存显示。
利用指针化数组,将各文件所申请的内存放入到数组中,然后利用对数组的快速遍历,来查询被占用的内存地址,同时利用逻辑地址将他们在画面中显示出来,而且是动态刷新。
显式链接。
把用于链接文件各物理块的指针,显式地存放在内存的一张链接表中。
该表在整个磁盘中仅设置一张,表的序号是物理盘块号,从0开始,直至N-1;
N为盘块总数。
在每个表项中存放链接指针,即下一个盘块号。
在该表中,凡是属于某一文件的第一个盘块号,或者说是每一条链的链首指针所对应的盘块号,均作为文件地址被填入相应文件的FCB的“物理地址”字段中。
由于查找记录的过程是在内存中进行的,因而不仅显著的提高了检索的速度,而且大大减少了访问磁盘的次数。
2、系统设计:
2.1模块设计
此课程设计把文本作为研究对象来模拟操作系统的文件系统工作过程。
所以用一个字符串数组来模拟磁盘空间,顾名思义,模拟磁盘提供字符的存储服务。
所有用户构成一个数组,每个数组元素是一个结构体,每个结构体包括三部分,用户的用户名、用户密码和文件链表(由于模拟文件系统的文件数量不多,故文件表采用线性链表来存储。
线性表每个结点放置一个文件的FCB,其中存储一个文件的信息,文件名、长度、类型、创建时间等);
磁盘空间分配表,采用链表结构,每个节点保存模拟磁盘的一个逻辑块的信息,包括块的最大长度,文件占用长度,占用标志。
如果占用标志为0,即该空间可分配给文件。
初始化磁盘空间分配表链表,首先把整个模拟磁盘作来一块,并置占用位为0。
当有进程申请磁盘空间时,从头开始遍历,检查占用位,如果该块为可分配,则检查块大小,若块长度大于或等于申请空间大小,则把块的前一部分(等于申请大小)分配给文件,并置标志位为占用。
剩下的大小作来一个新块,作来一个新节点插入到原节点的后边,标志位为可用。
这样就实现了模拟磁盘的线性分配。
实体关系图
命令服务
模拟磁盘
文件链表
磁盘空间分配表
用户
程序功能图
模拟二级文件系统
主界面
功能选择
用户登录
创建用户
退出程序
创建文件
删除文件
退出用户
关闭文件
打开文件
磁盘使用情况
显示目录
重命名文件
修改权限
查询属性
写入文件
查看文件
创建用户名
2.2数据结构说明
通过分析课程设计要求,具体设计出如下数据结构:
1、#defineMaxUser10//定义最大MDF主目录文件
#defineMaxDisk512*1024//模拟最大磁盘空间
chardisk[MaxDisk];
//模拟512K的磁盘存储空间
通过一个字符串数组来模拟磁盘空间,数组最大长度设置为MaxDisk512*1024,即磁盘空间最大容量为512*1024字节,并且可以根据需要调整大小。
作为模拟文件系统,主要理解文件系统的原理,可以把文本文件作为对象来研究。
故磁盘空间用一个字符串数组来模拟。
2、structfreeDiskTable//碰盘空间分配表
{
intstart;
//开始位置
intlength;
//占用长度
intmaxLength;
//最大长度
intuseFlag;
//使用标志,1为占用,0为空闲
};
通过结构体,将磁盘空间使用情况(文件开始位置、占用长度、最大长度、使用标志)结合在一体。
一个结构体变量记录磁盘一个块的信息。
结构体作为链表的一个节点,设置一个链表将节点连接起来,构成一个磁盘空间分配表。
3、structfileTable//文件表
charfileName[10];
//文件名字
intlength;
//文件长度
intmaxLength;
charfileKind[3];
//文件种类,此默认为txt
structtm*timeinfo;
//文件创建时间
通过结构体,将文件名字、文件在磁盘的开始位置、文件长度、文件最大长度、文件类型、创建时间结合在一起。
文件类型,本模拟程序使用txt类型。
设置一个线性表来存储文件。
4、//两级目录结构体
typedefstructuser_file_directory//用户文件目录文件UFD
//charfileName[10];
fileTable*file;
user_file_directory*next;
}UFD;
//UFD*headFile;
typedefstructmaster_file_directory//主文件目录MFD
charuserName[10];
charpassword[10];
UFD*user;
}MFD;
2.3算法流程图
程序流程图中可以分为几类,除了主流程图外,创建和删除、打开和关闭、读取和写入、显示文件目录和查看文件属性、修改文件属性和重命名、退出用户和退出程序,下面只列出创建文件、写入文件和显示文件目录三种功能的流程图作为代表。
开始
初始化磁盘
初始化UFD文件的头指针
初始化文件长度
命令是否有效?
分析命令
输入命令
N
Choice==1
Y
输入用户名
YN
创建成功或失败
用户名及密码是否正确?
1创建用户2用户登录
执行命令
命令是否正确?
创建
删除
查看
写入
查询
修改
重命名
显目录
磁盘
打开
关闭
退用户
退程序
用户界面
1、主程序流程图
查询文件表
文件表中有该名字?
Y
显示重名
申请磁盘空间
申请成功?
返回
显示失败原因
在磁盘空间分配表中登记
登记:
最大长度=申请长度
开始位置=申请节点位置
空闲情况=占用等
在文件表中登记
为新文件建立FCB后存储
显示创建成功
2、创建文件流程图
在不在文件表中?
文件不存在
文件可写?
NY
写入参数合法
显示参数不合法
写进模拟磁盘
写入成功
3、写入文件流程图
是否超级用户?
命令带用户名?
命令带参数?
NYN
输出自己及共享文件
参数为all?
带当前用户名?
列出自己文件及共享文件
列出所有用户所有文件
无权查看
参数为用户名?
列出自己及共享文件
列出用户及共享文件
没有该用户
4、显示文件目录流程图
四、系统测试与调试分析
1、系统测试
测试说明
测试名称
模拟二级文件管理系统
测试目的
验证系统对于系统登录的处理流程
测试技术
单元测试
测试方法
黑盒测试法
测试用例
测试内容
用户登录功能—用户名
测试步骤
正确用户名与密码
正确用户名与错误密码
输入错误用户名与密码
测试数据
admin,正确密码
admin,错误密码
错误用户名
预期结果
正常进入系统
显示密码错误
显示用户不存在
测试结果
与预期相符
验证用户创建文件的处理流程
用户创建文件功能
输入正确命令格式
输入错误命令格式
createa1100rw
Createa1
创建文件成功
显示命令格式错误
验证用户删除文件的处理流程
用户删除文件功能(默认文件是关闭的,即可被关闭)
正确格式和文件名
正确格式与错误文件名
输入错误文件名和格式
File1,正确格式
rmFile2,错误文件名
错误命令格式
正常删除文件
显示无法找到文件
验证用户打开文件的处理流程
用户打开文件功能
输入正确格式和文件名
输入正确格式和错误文件名
openFile2,错误文件名
错误格式
正常打开文件
显示没有该文件
验证用户关闭文件的处理流程
用户关闭文件功能
输入正确文件名与格式
Closefile1
CloseFile2,错误文件名
正常关闭文件
无法找到该文件
验证用户读取文件的处理流程
读取文件内容功能
输入正确用户名与文件名
输入正确用户名与错误文件名
输入错误用户名与错误文件名
Readafile1
Readafile2
正确读出文件内容
显示无法找到该文件或权限不够
验证写入文件的处理流程
用户写入功能
输入正确文件名和格式
输入正确文件名与错误格式
输入错误文件名和正确格式
Writea
Writea
错误文件名
正常写入文件
显示输入命令不正确
显示文件不可写
验证列文件目录功能的处理流程
列文件目录功能
输入正确用户名与格式
输入正确用户名与错误格式
输入错误用户名与正确格式
admin,正确格式
admin,错误格式
正常列出文件目录
2、调试分析:
程序的调试过程会发现很多设计程序过程中的漏洞,也会有很多bug出现,需要仔细的不断调试才能尽量的把程序调试的完美,我的程序调试的过程中出现的问题较多,现列举几个比较有代表性的,希望供其他人参考
Ⅰ、首先,我建立了一个数组记录所有的用户名、用户密码和指向用户文件目录的指针,然后又编制了几个函数功能满足老师给的题目要求,但是后来想要建立超级用户的时候不知道该如何建立才能满足超级用户能查看所有用户的非只写文件,并且还要列出所有用户的所有文件目录。
后来和同学讨论了之后,在数组里建立了一个默认的用户作为超级用户,并且在读文件的时候要先判断是否是超级用户,是的话就可以读取非只写文件,非超级用户的话只能读取自己的文件和共享文件。
列目录命令的时候判断如果是超级用户的话,在文件列表中取出所有的文件及文件属性,非超级用户的话只能列出自己的文件和共享文件。
代码部分会有些冗余,但是总算实现了基本的功能,我也认识到编程的时候要提前做好设计的重要性。
Ⅱ、建立共享文件的时候,我只是想到要让其他用户看到该共享文件,所有在列文件目录的功能函数里加上了列文件目录的时候遍历其他用户的文件表的过程,如果是共享文件的话就可以列举出来了,但是后来看到老师答辩的时候要实现读出来共享文件内容的功能,我才想到,共享文件是可以被其他用户查看内容的,所有又改了一段时间,发现不只是读不出共享文件的问题,是读取文件内容的时候有很多逻辑上的漏洞,所有我重新调整了一下,把命令格式改成同时读取用户名和文件名,判断当前用户是否是超级用户,是的话可以读取任何用户的任何非只写文件,当前用户是普通用户的话如果是命令中用户是当前用户,则可以读出当前用户的所有非只写文件,如果当前用户是普通用户的话,命令中用户名是其他用户的话,只能读取共享文件的内容,其他的属性文件则无权限读取。
Ⅲ、比较低级的一个错误是,之前忽略了open文件的功能,我以为read功能是打开文件再读的,所以我认为可以不需要open功能的,但是后来发现关闭功能的一些属性的时候,觉得必须有和关闭功能对应的,文件可以只打开和关闭的。
五、用户手册
1、windows系统cmd控制台
2、本程序不需要安装使用,直接运行即可弹出控制台
3、
图1:
系统登录界面图2:
程序执行后就会出现图1,选择功能1创建新用户,例如创建用户名和密码都是a的用户如图2
图3:
用户登录图4:
用户命令界面
创建过用户后还在主界面,可以选择功能2,用户登录,输入正确用户名和密码后登录成功,例如上面建的用户a,密码a,点击任意键进入用户命令界面,会列出用户所有可以执行的命令列表,如图4
1、可以输入创建文件命令,命令格式为createa11000rw,将创建名为a1,长度为1000字节,可读可写的文件,创建文件后默认是关闭的,可以用打开功能打开(只是打开,并不读取文件内容),命令格式为opena1,可以打开文件a1;
2、可以向已经创建的可写的文件内写入内容,命令格式为writea1,控制台给出提示后输入要写入的内容。
还可以关闭已经打开的文件,命令格式为closea1,将关闭已经打开的文件a1。
3、可以读取允许读取的文件内容,命令格式为read用户名文件名,例如readaa1,这时显示出文件内容,并且文件被打开,可以删除文件,但是要先关闭已打开的文件,否则会提示无法删除被进程打开的文件,删除命令格式rm文件名,如rma1。
4、另外还有退出用户和退出程序的功能,但是输入功能后控制台就执行完毕,无法截图,在此省略。
六、程序清单
1、//main函数
intmain()
各命令格式
command[50],command_str1[10],command_str2[10],command_str3[5],command_str4[3];
inti,k,j;
intlength=0;
initDisk();
//初始化磁盘
for(i=0;
i<
MaxUser;
i++)//初始化用户UFD目录文件的头指针
{
userTable[i].user=(UFD*)malloc(sizeof(UFD));
userTable[i].user->
next=NULL;
}
while
(1)
{//主界面
printf("
1、createuser\n"
);
2、login\n"
Pleasechoocethefunctionkey:
>
"
intchoice;
scanf("
%d"
&
choice);
if(choice==1)
{
userCreate();
}
elseif(choice==2)
userID=login();
else
printf("
您的输入有误,请重新选择\n"
while(userID!
=-1)
fflush(stdin);
printf(//用户命令界面,用户可以使用的各种命令及命令格式);
pleaseimputyourcommand:
gets(command);
intselect;
for(i=0;
command[i]!
='
'
&
\0'
;
i++)
{
command_str1[i]=command[i];
}
k=i;
command_str1[k]='
commandAmount;
if(!
strcmp(command_str1,order[i]))
{
select=i;
break;
}
if(i==commandAmount)
printf("
您输入的命令有误,请重新输入\n"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 二级 文件 管理 课程设计 报告