实验五 磁盘文件操作.docx
《实验五 磁盘文件操作.docx》由会员分享,可在线阅读,更多相关《实验五 磁盘文件操作.docx(27页珍藏版)》请在冰豆网上搜索。
实验五 磁盘文件操作
一、实验目的
深入了解磁盘文件系统的实现。
二、实验预备知识
文件的操作;
文件的逻辑结构和物理结构;磁盘空间的管理;
磁盘目录结构。
三、实验内容
设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现:
支持多级目录结构,支持文件的绝对读路径;
文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;采用文件分配表;
实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。
最后编写主函数对所做工作进行测试。
四、提示与讲解
为了正确地实现文件的存取,文件系统设计了一组与存取文件有关的功能模块,用户可以用“访管指令”调用这些功能模块,以实现文件的存取要求。
我们把文件系统设计的这一组功能模块称为“文件操作”,实验就是要模拟实现一些文件操作。
文件操作不是独立的,它和文件系统的其他部分密切相关,若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。
因此,这个实验虽然是文件操作的模拟实现,但是还必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。
(1)文件的组织结构
文件的逻辑结构有两种形式:
流式文件和记录式文件。
实验中只支持流式文件,采用称为显示链接的物理文件结构,把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。
文件分配表的作用不仅如此,其他的作用下面将提到。
磁盘有多少块,文件分配表就有多少项,若某文件的一个磁盘块号为i,则这个文件的下一个磁盘的块号应该记录在文件分配表第i项。
例如,某系统文件分配表前几项值如图
10所示。
某个文件的起始盘块号为3,则该文件的磁盘块号依次为3、4、9、12、13。
第几项
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
内容
-1
-1
-1
4
9
0
7
8
-1
12
11
-1
13
-1
0
0
…
(2)磁盘空间的管理
图10某磁盘文件分配表部分内容
首先要模拟一个磁盘。
因为是实验,不使用真正的磁盘,所以实验中用一个文件模拟一个小磁盘。
假设模拟磁盘有128个物理块,每个物理块大小为64字节。
盘块的块号从0编起,0,1,2,3……,127。
将前面所讲的文件分配表放在磁盘的开始处,因为盘块有128块,所以文件分配表有
128项,每项占用一个字节。
这样文件分配表占用了磁盘的0块和1块,这两块就不能作其他用处。
若一个盘块是某个文件的最后一块,填写“-1”表示文件结束。
文件的建立和删除就需要对磁盘的空间进行分配和回收,所以要建立一定的数据表格来记录磁盘的使用情况。
用文件分配表的第i项表示第i个盘块的使用情况。
磁盘的第0块一定会被系统数据占用,所以任何一个文件的某个盘块块号都不可能是“0”,因而还可以用“0”表示磁盘盘块空闲,若这个盘块已经分配出去,即是某个文件的一块,由上面我们知道文件分配表中对应项记录的是文件下一块的块号或结束标志都不是“0”。
这样非
“0”值表示盘块已分。
像前面图10那张文件分配表中,块号为5、14和15的盘块是空闲的,其余是已分配的。
在文件分配表中可以用一个超过盘块编号的正整数表示文件结束,在此实验中采用255代替-1表示文件结束。
如果磁盘中某些部分损坏,只要不是系统区(引导扇区、文件分配表或根目录等),不分配那些坏的盘块,磁盘可以继续使用。
在文件分配表对应坏盘块的项不能是“0”,一般也需要特定的数值表示(这个数值应该是盘块编号以外并且不是结束标志的数值,例如,实验中128~254之间的数值)。
假设实验中模拟磁盘的第13块和第49块已经损坏,不能使用,则在文件分配表的第13项和第49项写入“254”表示该盘块损坏不能使用。
开始
找到文件分配表第x项,
i=x
由于磁盘分配时,有时不能预定文件的大小,例如建立文件时并不知道文件的大小。
因而磁盘的分配有时是一块一块申请的。
磁盘空间回收时,整个文件删除时回收很多块,但有时文件修改时可能会删除某些内容,造成归还磁盘块,这时是一块一块回收的。
这里给出申请一块磁盘空间的流程图,若分配多块时,循环多次即可。
分配一个磁盘块时,不应该从文件分配表第一项查起,因为磁盘中最开始的几块为系统数据区(引导扇区、文件分配表、根目录等占用),所以应该从这之后的可分配数据区开始查询。
假定系统区域占用了x个盘块,分配一个磁盘块的流程如图11所示。
回收一个磁盘块的流程图很简单,比如回收磁盘块的块号为x,只要找到文件分配表中第x项,将第x项的值改为0即可。
Y
第i项值是否为0?
N
N
第i项是否为最后一项?
Y
磁盘满,分配失败
结束
分配第i块
i=i+1
(3)目录结构
图11分配一个磁盘块的流程图
文件目录是用于检索文件的,它是文件系统实现按名存取的主要手段。
文件目录由若干目录项组成,每一个目录记录一个文件的有关信息。
一般地说,目录项应该包括如下内容:
①有关文件的控制信息。
例如,用户名、文件名、文件类型、文件属性。
实验模拟个人计算机上的文件操作,这部分内容仅包括文件名、文件类型和属性;
②有关文件结构的信息。
例如,文件的逻辑结构、文件的物理结构、记录个数、文件在存储介质的位置等。
实验中,仅仅支持流式文件,不支持记录式文件,所以这部分内
容仅仅包括文件在存储介质的位置(分给文件第一个盘块的块号,即起始盘块号)、文件的长度;
③有关文件管理的信息。
例如,文件的建立日期、文件被修改的日期、文件保留期限和记帐信息等。
实验中为了简单起见,这部分内容都不采用。
因此,实验中文件的目录项包括:
文件名、文件类型、文件属性、文件的起始盘块号、文件的长度,每个目录项占用8个字节,具体结构如下所示:
文件名:
3个字节(实验中合法文件名仅可以使用字母、数字和除“$”、“.”和“/”
以外的字符,第一个字节的值为“$”时表示该目录为空目录项,文件名和类型名之间用“.”分隔,用“/”作为路径名中目录间分隔符);
文件类型名:
2个字节;文件属性:
1字节;
起始盘块号:
1个字节;
文件长度:
1个字节(为了实验的简单,文件长度单位为盘块)。
有了文件目录后,当用户要求使用某个文件时,文件系统可以顺序查找目录项,并比较文件名,就可以找到指定文件的目录项,根据目录项中有关内容核对使用权限、并读出文件供用户使用。
因此文件目录的组织和管理要便于检索和防止冲突。
在操作系统中目录就有根目录和子目录两种目录。
除了文件需要登记形成目录外,还要登记子目录的情况。
实验中,根目录固定位置、固定大小(可以登记有限个文件或子目录项),子目录像文件一样,可使用任何一个空闲磁盘块。
为了实验简单,实验中根目录占用了一个盘块,子目录的长度没有采用可以任意长的方法,而是采用了定长的方法,每个子目录的长度也是一个盘块,只能放8个目录项。
文件和目录的登记项是混在一起的,登记项的结构应该和文件目录一样,每个目录项占用8个字节,结构如下:
目录名:
3个字节(实验中合法文件名仅可以使用字母、数字和除“$”、“.”、“/”以外的字符,第一个字节的值为“$”时表示该目录为空目录);
未使用2字节(在实验中填写空格);目录属性:
1字节;
起始盘块号:
1个字节;
未使用1字节(在实验中填写“0”)。
在目录登记项中,系统为目录名后2个字节(对应文件类型名位置)填写空格,目录起始盘块号后1字节(对应文件长度位置)填写0。
目录属性和文件属性占用同一个字节,为了区别目录和文件,该字节每一位代表不同的含义(为“1”表示“是”,为“0”表示
“否”),如图12所示,第0位表示文件为只读文件,第1位表示文件为系统文件,第2位表示文件为一般可读、可写的普通文件,第3位表示该登记项不是文件的登记项,而是目录的登记项,其余几位闲置未用。
如该字节为8(8=(00001000)2)表示该目录是一个目录的登记项,该字节为3(3=(00000011)2)表示该目录是一个只读系统文件的登记项,该字节为(4=(00000100)2)表示该目录是一个可读可写的普通文件。
第7位 第6位 第5位 第4位 第3位 第2位 第1位 第0位
未使用
未使用
未使用
未使用
目录属性
普通文件
系统文件
只读文件
图12属性字节各位作用示意图
目录检索的方法常用的是顺序检索,根据绝对路径名查找文件的方法一般如下:
先找到根目录的起始盘块,一般根目录位置是固定的,实验中就是模拟磁盘的第2块,将该盘块读出;取出路径名中根目录后的目录名或文件名,和根目录中目录项依次比较,比较完一块,再根据文件分配表找到下一块,再读入比较,直到找到名字一致的目录项或根目录登记项均已查完为止;若没有找到,则查找失败,结束;若查找的是文件,结束;若查找
的是目录,从找到的目录项中,取出目录的起始盘块号,读入此盘块,然后用上述相同的查找方法继续查找,直到找到该文件(或目录)或查找失败结束。
查找绝对路径名name
实验中,使用绝对路径查找文件(或目录)的流程如图13所示。
是绝对路径的 Y
最后一部分且是文件名?
N
N
第j项是该盘块一项?
第j项是该盘块一项?
N
Y
Y
文件名为pna且类型名为type?
N
N
第j项是目录且名字等于pna?
Y
N
Y
last==1?
Y
查找成功
Y
结束
查找成功
j=j+1
j=0
j=j+1
j=0
i=该目录起始盘块号
查找失败,该文件或目录不存在
若pna为目录名或文件名最后一部分,
last=1
读出磁盘第i块,存在buffer2中
pna=从name中分离出“/”后下一个目录名(或文件名);若是文件,分离出类型名type
i=根目录的起始盘块号;last=0;
图13使用绝对路径查找文件(目录)的流程图
查找文件除了绝对路径名外,还可以使用相对路径名。
相对路径名是从当前目录出发到指定文件的路径。
如果文件(或目录)在当前目录下,使用相对路径名查找速度比较快。
和绝对路径的查找方法一样,只是查找的起点是当前目录,不是根目录。
实验中只使用了绝对路径名。
(4)文件操作
确定文件组织结构、目录结构和磁盘空间管理的方法后,就可以模拟文件操作的实现。
实验中文件操作包括建立文件(create_file)、打开文件(open_file)、关闭文件(close_file)、读文件(read_file)、写文件(write_file)、删除文件(delete_file)、显示文件内容
(typefile)和改变文件属性(change),目录命令包括建立目录(md)、显示目录内容
(dir)和删除空目录(rd)。
在实验中没有程序调用这些指令,为了看到它们的模拟情况,从键盘输入选择指令来模拟用户程序的调用。
首先要建立一个“已打开文件表”,用来记录打开或建立文件的相关内容,结构如图
14所示。
文件路径名
文件属性
起始盘块号
文件长度
操作类型
读指针
写指针
块号
块内地址
块号
块内地
址
…
…
…
…
…
…
图14已打开文件表结构
用数组模拟已打开文件表,数据结构定义如下:
#definen5 //实验中系统允许打开文件的最大数量typedefstruc