编码实现简易的文件系统,功能包括磁盘初始化、新建文件、删除文件、更新文件、查找文件、文件统计、磁盘统计、分配策略选择。
本项目系 《操作系统》 课程设计的实践项目,旨在帮助理解文件系统的基本原理和实现方式。
- 磁盘空间的模拟: 通过二维数组
fileData [x][x]模拟磁盘空间。 - 分配算法: 连续分配法,在fileData内为文件分配连续的空闲存储空间。
- 文件系统功能
- 磁盘初始化:初始化相关数据结构,完成磁盘的初始化(若磁盘已存储信息,相当于格式化磁盘)
- 新建文件:输入文件名和文件内容,创建文件(文件不允许重名)
- 删除文件:输入文件名,删除文件(若没有找到,给出适当提示)
- 更新文件:输入文件名,找到该文件并显示内容,然后重新输入内容保存到该文件(若没有找到,给出适当提示)
- 查找文件:输入文件名,显示文件内容(若没有找到,给出适当提示)
- 文件统计:按文件大小,从大到小按行显示所有文件(文件名+文件大小+文件内容)
- 磁盘统计:打印磁盘存储情况(格式化打印数组fileData,空闲元素打印'-')
- 分配策略:最先适配、最佳适配、最坏适配(默认为最先适配)
DISK SIMULATION console (types 'exit' to quit)
console >在控制台中,提供基于指令的操作。
# 查看帮助信息
help
# 以给定的行数和列数初始化磁盘空间。
init <rows> <cols>
# 修改磁盘分配策略
mode <strategy, 0=first, 1=best, 2=worst>
# 写入文件内容到磁盘
w <file> [new_content...]
# 从磁盘中删除文件
rm <file>
# 查看文件内容
cat <file>
# 列出当前磁盘中的所有文件
ls
# 执行磁盘整理 (额外功能)
defragment-
命令注册机制
- 使用
Command结构体存储命令信息(名称、用法、描述和执行函数) - 通过
register_command函数注册新命令 - 支持最多 32 个命令(MAX_COMMANDS)
- 使用
-
命令解析器
parse_args函数负责将输入字符串解析为参数数组- 支持空格和制表符作为分隔符
- 每条命令最多支持 16 个参数(MAX_ARGS)
-
控制台运行器
console_run函数提供交互式命令行界面- 支持命令历史记录和退出功能
- 内置帮助系统,显示所有可用命令
-
存储结构
- 使用二维字符数组模拟磁盘存储空间
- 支持动态大小的磁盘空间(通过 rows 和 cols 指定)
- 文件元数据存储在独立的数组中
-
文件管理
FileMeta结构体存储文件元信息(名称、位置、大小)- 支持最多 32 个文件(MAX_FILE_COUNT)
- 文件名最大长度为 10 字符(MAX_FILE_NAME_LENGTH)
-
空间分配策略
- 实现三种分配策略:
- 最先适配(First Fit):选择第一个足够大的空闲空间
- 最佳适配(Best Fit):选择最小的足够大的空闲空间
- 最坏适配(Worst Fit):选择最大的空闲空间
- 使用连续分配方式,将二维空间视为一维连续空间处理
- 实现三种分配策略:
-
文件操作
- 文件创建:检查名称唯一性,分配空间,写入内容
- 文件删除:清除内容,更新元数据
- 文件读取:支持跨行读取,自动添加字符串结束符
- 文件更新:先删除后重新创建
-
磁盘维护
- 碎片整理:将文件重新排列,合并空闲空间
- 磁盘统计:显示存储使用情况
-
用户交互
- 提供命令行界面进行文件系统操作
- 支持文件内容的输入和显示
- 提供友好的错误提示
-
命令实现
init:初始化磁盘空间mode:切换分配策略w:写入文件内容rm:删除文件cat:查看文件内容ls:列出所有文件defrag:执行碎片整理
-
状态管理
- 维护全局磁盘状态
- 提供磁盘未初始化的检查
- 支持命令执行结果的反馈
本项目代码基于 GNU General Public License v3.0 开源。
万分感谢 Jetbrains 慷慨地提供了开源许可证,让我可以专心致力于开发此项目及其他开源项目之上。
