1 实验目的了解文件管理系统的作用和工作方式
了解FAT文件系统的结构
学习文件管理系统的一般开发方法
2 需求说明
2.1 基本要求
准备一个FAT16格式的U盘,在Linux下编写一个文件系统管理程序,对U盘上的文件进行管理。具体要求如下:
设计并实现一个目录列表函数(无须支持选项,如ls -a、ls -l等),用来显示当前目录下包含的文件信息
设计并实现一个改变目录函数(无须处理路径名,如../../directoryName等),用来把当前目录切换到上一层目录或当前目录的子目录
设计并实现一个删除文件函数,使用当前目录中的要删除的文件名作为参数,用来删除指定的文件,要注意文件的隐藏、只读和其他系统属性
设计并实现一个创建文件函数,使用要创建的文件名和文件大小作为参数,用来创建一个新的文件
2.2 提高要求增加创建目录的功能
增加删除目录的功能:通常需要先判断目录是否为空目录,若目录不为空,则需给出提示,并删除其包含的所有子目录和文件;若是空目录则可以直接删除
增加绝对路径和多级目录的支持:这里需要对输入的目录路径字符串进行解析,然后逐级查找目录
对ud_cf()函数进行改进,使其可以向文件中写入实际内容,并根据写入的内容计算文件的实际大小
对ud_ls()函数进行改进,增加对全部非根目录信息的读取(基本要求中仅读取一个扇区的非根目录细信息)
2.3 完成情况
完成了以下功能:
设计并实现一个目录列表函数(无须支持选项,如ls -a、ls -l等),用来显示当前目录下包含的文件信息
设计并实现一个改变目录函数(无须处理路径名,如../../directoryName等),用来把当前目录切换到上一层目录或当前目录的子目录
设计并实现一个删除文件函数,使用当前目录中的要删除的文件名作为参数,用来删除指定的文件,要注意文件的隐藏、只读和其他系统属性
设计并实现一个创建文件函数,使用要创建的文件名和文件大小作为参数,用来创建一个新的文件
增加创建目录的功能
增加删除目录的功能:通常需要先判断目录是否为空目录,若目录不为空,则需给出提示,并删除其包含的所有子目录和文件;若是空目录则可以直接删除
增加绝对路径和多级目录的支持:这里需要对输入的目录路径字符串进行解析,然后逐级查找目录
对ud_cf()函数进行改进,使其可以向文件中写入实际内容,并根据写入的内容计算文件的实际大小
对ud_ls()函数进行改进,增加对全部非根目录信息的读取(基本要求中仅读取一个扇区的非根目录细信息)
3 设计说明
3.1 程序流程图
主控函数图
创建目录(fd_cdir)函数图
删除文件(fd_df)函数图
删除目录(fd_ddir)函数图
ls函数图
Cd函数图
Cf函数图
3.2 基本要求实现说明
目录列表函数,实现效果如图。
改变目录函数,实现效果如图。
删除文件函数,实现效果如图。
创建文件函数,实现效果如图。其中加入了确定创建时间的代码,代码如下图。
3.3 提高要求实现说明
3.3.1 创建目录
这次创建目录的函数基本与创建文件的函数一致,不同的是size固定为8192字节,同时还需要向数据区写入文件。运行结果如下:
由于源代码过长,不方便截图展示,若想查看源代码请下载源代码包。
3.3.2 删除目录
删除目录需要考虑到目录里面还有文件和文件夹,所以就使用了一个递归函数来删除。运行结果如下:
由于源代码过长,不方便截图展示,若想查看源代码请下载源代码包。
3.3.3 Cf函数
通过将clusterno数组中所有簇号,转换为实际磁盘地址,将内容写入。读取函数使用gets(),输入的东西存下来,传入函数中。
3.3.4 Cd函数
支持cd时使用绝对路径和多级目录。如可以使用cd /d1/d2/d3(绝对路径)、cd d1/d2/d3(相对路径)。
如图,图中根目录下有多级目录/D1/D2/D3/D4/D5,首先使用绝对路径跳转到D4,然后使用相对路径跳转到D2,在使用相对路径跳转到D4。当输入一个无效路径是提示错误,工作目录仍保留在D4。
3.3.5 ls函数
代码部分:
具体效果:
4 实验遇到的问题及解决方法
一开始给虚拟U盘文件分配2G时,SectorPerFAT和RootDirEntries都是0,没有办法继续进行试验。后来经过不断地尝试和不断地查找资料,发现是空间太大了,只要分配的空间小一点,比如128M,就没问题了。
一开始我们把ReservedSector理解成空白扇区了,所以在程序中进行的操作和shell下进行的操作总是不一致,不能很好地进行测试。后来才发现ReservedSector的值是引导扇区加上空白扇区的值,然后再更改完偏移量后,就能够正常运行了。
5 收获和感想
这次实验让我比较深入的了解了FAT16文件系统的运行机制,原理和它主要的数据结构。中间虽然踩了大大小小无数的坑,但是总体来说这次实验还是让我提高了很多的。我认为最主要的收获就是让我了解了FAT16文件系统的运行方法,还有一些重要的概念,比如簇的概念,FAT表的概念,root directory entries的概念,引导扇区的概念,数据区的概念等等。