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

1 实验目的了解文件管理系统的作用和工作方式

了解FAT文件系统的结构

学习文件管理系统的一般开发方法。

2 需求说明

2.1 基本要求设计并实现一个目录列表函数(无须支持选项,如ls -a、ls -l等),用来显示当前目录下包含的文件信息

设计并实现一个改变目录函数(无须处理路径名,如../../directoryName等),用来把当前目录切换到上一层目录或当前目录的子目录

设计并实现一个删除文件函数,使用当前目录中的要删除的文件名作为参数,用来删除指定的文件,要注意文件的隐藏、只读和其他系统属性

设计并实现一个创建文件函数,使用要创建的文件名和文件大小作为参数,用来创建一个新的文件

2.2 提高要求增加创建目录的功能

增加删除目录的功能:通常需要先判断目录是否为空目录,若目录不为空,则需给出提示,并删除其包含的所有子目录和文件;若是空目录则可以直接删除

增加绝对路径和多级目录的支持:这里需要对输入的目录路径字符串进行解析,然后逐级查找目录

对ud_cf()函数进行改进,使其可以向文件中写入实际内容,并根据写入的内容计算文件的实际大小

对ud_ls()函数进行改进,增加对全部非根目录信息的读取(基本要求中仅读取一个扇区的非根目录细信息)

2.3 完成情况

完成了以下功能:

实现一个目录列表函数

实现一个改变目录函数

实现一个删除文件函数

实现一个创建文件函数

增加创建目录的功能

增加删除目录的功能

增加绝对路径和多级目录的支持

对ud_cf()函数进行改进

对ud_ls()函数进行改进

3 设计说明

3.1 程序流程图

4144437e050de95b267c6feda4cb8462.png

3.2 基本要求实现说明实现一个目录列表函数

实现一个改变目录函数

实现一个删除文件函数

实现一个创建文件函数

3.3 提高要求实现说明

3.3.1 创建目录

参考源代码中创建文件的内容。目录事实上和文件是同一性质的,只是表现出来的属性为目录,因此在源代码上的改动不是很多,主要是在调用函数ScanEntry时涉及参数传递等问题。在此基础上,我们是能够支持多级目录的。

此部分代码如下:

60210198a7b7753827a8f43405f91ed6.png

3.3.2 删除目录

参考源代码中删除文件部分的内容。新增了一个删除单个目录时的函数fd_dd,由于目录事实上和文件是同一性质的,只是表现出来的属性为目录,此部分较源代码删除文件部分改动不大。

92bda9714420a7f407098c4a2d4facb3.png

在fd_dd基础上,我们设计了一个递归删除目录的函数fd_dfd,用来删除目录下的所有内容:若为文件,则调用fd_df删除,否则若为目录,则调用本身对于此目录继续递归删除,直至目录为空,再将之删除。代码如下:

77ed1c326542d1b1bdafd4726c130332.png

3.3.3 对绝对路径的支持

我们首先实现了两个函数 fd_multiCd和fd_multiCd1用于将读入的绝对路径转化为相对路径,在其中我们利用了fd_cd函数实现路径的不断转移。在cd指令和其他指令使用了绝对路径的时候,我们将分别调用fd_multiCd和fd_multiCd1这两个函数用来实现路径的转移。代码如下:

352bb42fa30c1d9355ea3f9a7c71cff6.png

6146537230019a021e3aa391325ca4a3.png

由于以上的改动,在do_usage以及main中都做了相应改动,代码如下:

6e8848fb828bb0da1195962c4659c6c3.png

5aae5e9d95051a52ad21da801f1804dc.png

对fd_cf()函数进行改进

改变fd_cd的第二个参数为字符串,size大小即为字符串长度(char每个占1字节),且进行判断若字符串的每一个字符均为数字,则认为输入的size大小,否则size为字符串所占大小。代码如下:

54df4fd4b4c6561217b8031181ec15c5.png

对fd_ls()函数进行改进

首先要将ls的非根目录访问从一个扇区(512)改进。我们认为访问一个簇(512*64)足够了,如此可以访问1024个目录项。将代码中的SECTOR_SIZE改为CLUSTER_SIZE。

一些运行样例

50a74078c08385318249a57e2911b943.png

fa4ec65a0d276cb009c449f72fd5a061.png

eb6ac363a75eda3cf0eeebe4a3172906.png

bd03f6e25abbb58312d9ebe800189508.png

4 收获和感想

本次实验的基础知识较为繁杂,如果对文件系统的基础知识了解不足很容易对源码就产生误解,也无法理解bug的行为。所以本次实验主要花费时间在研习书本、了解知识上。对ls和cf的修改,逻辑上都较为简单,但是容易发生偶发性的细节错误,主要的debug时间就花在了这上面。

本次os实验其实并不算很难,关键在于理解FAT文件系统的工作原理,怪自己上课时候没有认真听讲,最开始做的时候完全是一头雾水,代码根本看不懂,就连PPT也是一知半解,看实验指导书,也还是不太明白具体的FAT表项,文件分配表等等的概念,总是混为一谈,去网上搜索,得到的结果也是鱼龙混杂,走投无路之时,看到实验指导书上的第四章有一部分关于FAT文件系统的详细讲解,总会总算是弄明白了FAT文件系统的工作方式和运行的原理,做实验的过程中还发现自己这段时间一直使用java语言,对C语言的使用十分手生,连二维字符数组的初始化都不会了,各处搜索,费了好大的力气,走了不少的弯路,看来学习新知识的时候也要记得复习旧知识啊!

这次实验主要是针对文件系统进行考察,不得不说由于课上听讲效率有些偏低导致了在具体实验时遇到了一些问题,好在大家都很认真,一直在努力。本次实验的代码部分可以说部分是参考了源代码的,这让我们在生了一些力气的同时,也认识到自己代码编写能力的欠缺。说到代码编写能力,这次可以说是深有体会,由于C语言中指针运用不熟练,在编写函数时出现了许多问题。整体来说,这次实验在深化了课堂知识的同时也提高了我们的代码编写能力,尤其是磨练了我们的意志。感谢一起努力的同伴们!

这次实验需要文件系统的知识,然而对于老师上课讲过的知识,听得不是很认真,课下没能及时的复习,掌握的不牢固,不过多亏了小组制度,给了大家一个合作的机会,互相帮助,互相扶持,能够更好的完成作业。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值