c语言文件系统操作函数,课内资源 - 基于C语言实现的文件系统模拟

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 程序流程图

主控函数图

f1d99a9a143472ca6b4b50c70ecb8fdc.png

创建目录(fd_cdir)函数图

3b8d0be52213bbe457f1a5a009b68c77.png

删除文件(fd_df)函数图

eb529d076d16d5bb30258f46241e469b.png

删除目录(fd_ddir)函数图

b6cceba1e022b3c346dcf66fdde1906e.png

ls函数图

477c136adce7daefd69cd8d02cee4c2c.png

Cd函数图

68bbea98ad1e9a33ee4ca320297977dd.png

Cf函数图

04de0dc47b3374bc348a42a0ea0caa24.png

3.2 基本要求实现说明

目录列表函数,实现效果如图。

ff57d4041007663a352bff7c1456ebf3.png

改变目录函数,实现效果如图。

18ebd695450f51f06617c1454ebd7ac5.png

删除文件函数,实现效果如图。

6962aaa0c2d2797353dd441d60bdbe0a.png

创建文件函数,实现效果如图。其中加入了确定创建时间的代码,代码如下图。

18ae3159611fc9ce31ed399badf11ea1.png

a3d953b70943eefee63866af1d15f589.png

3.3 提高要求实现说明

3.3.1 创建目录

这次创建目录的函数基本与创建文件的函数一致,不同的是size固定为8192字节,同时还需要向数据区写入文件。运行结果如下:

5038b4512c79945d37fa510d159aba25.png

由于源代码过长,不方便截图展示,若想查看源代码请下载源代码包。

3.3.2 删除目录

删除目录需要考虑到目录里面还有文件和文件夹,所以就使用了一个递归函数来删除。运行结果如下:

3d83779531ecc9977c1d0019447ea3d2.png

由于源代码过长,不方便截图展示,若想查看源代码请下载源代码包。

3.3.3 Cf函数

通过将clusterno数组中所有簇号,转换为实际磁盘地址,将内容写入。读取函数使用gets(),输入的东西存下来,传入函数中。

d4d13705c5094d266138e218aed9a1c4.png

1a1fd58509ca73a5f2568054c8d47d4f.png

6bab8d851384b4b83d63b952a8f265f8.png

47151bdb6013cae4f0b020c509cee248.png

3.3.4 Cd函数

支持cd时使用绝对路径和多级目录。如可以使用cd /d1/d2/d3(绝对路径)、cd d1/d2/d3(相对路径)。

如图,图中根目录下有多级目录/D1/D2/D3/D4/D5,首先使用绝对路径跳转到D4,然后使用相对路径跳转到D2,在使用相对路径跳转到D4。当输入一个无效路径是提示错误,工作目录仍保留在D4。

9fafdc09baf0f4cfef34c5cfeb06b06d.png

3.3.5 ls函数

代码部分:

b9ee3af819f176f62df3b5cd4f7d5bdf.png

具体效果:

85f37c3523bb2898a980eb34e32e67e8.png

4 实验遇到的问题及解决方法

一开始给虚拟U盘文件分配2G时,SectorPerFAT和RootDirEntries都是0,没有办法继续进行试验。后来经过不断地尝试和不断地查找资料,发现是空间太大了,只要分配的空间小一点,比如128M,就没问题了。

一开始我们把ReservedSector理解成空白扇区了,所以在程序中进行的操作和shell下进行的操作总是不一致,不能很好地进行测试。后来才发现ReservedSector的值是引导扇区加上空白扇区的值,然后再更改完偏移量后,就能够正常运行了。

5 收获和感想

这次实验让我比较深入的了解了FAT16文件系统的运行机制,原理和它主要的数据结构。中间虽然踩了大大小小无数的坑,但是总体来说这次实验还是让我提高了很多的。我认为最主要的收获就是让我了解了FAT16文件系统的运行方法,还有一些重要的概念,比如簇的概念,FAT表的概念,root directory entries的概念,引导扇区的概念,数据区的概念等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值