操作系统课程设计中的文件管理系统主要关注的是树型目录结构的实现,这一结构允许用户按照层次关系组织文件和目录。设计思路是基于二叉树的概念,每个节点代表一个文件或目录,包含父指针、子指针和兄弟指针。通过这些指针,可以方便地在文件系统中导航和操作。
文件系统的核心功能包括文件和目录的创建、打开、关闭、读取、写入以及删除。以下是这些功能的详细说明:
1. **文件和目录的创建**:
- 在创建文件或目录时,系统会检查目标位置是否为空。如果为空,则直接将新文件或目录添加到该位置;如果不为空,系统会检查是否存在同名的文件或目录,若存在则创建失败,否则新项被添加为最后一个子节点的兄弟节点。
2. **文件和目录的打开与关闭**:
- 打开文件夹时,文件夹名及其地址会被压入“打开文件夹栈”中。关闭文件夹时,相关信息从栈中移除。
- 打开文件时,文件名和其父指针被写入“打开文件列表”,并设置文件打开标志为1。关闭文件时,文件从列表中删除,打开标志设为0。
- 读取和写入文件时,系统会检查文件是否在打开列表中,未打开的文件不能读写。此外,只读文件不允许写入,只写文件不允许读取。
3. **文件和目录的删除**:
- 删除文件或目录前,系统会检查是否满足条件。对于文件,必须确保没有打开;对于目录,必须确认无子文件或子目录正在被使用。否则,删除操作将失败。
- 删除目录时,会采用中序遍历方法来递归删除其下的所有子节点(子树)。
4. **数据结构**:
- 文件结构体(`struct file`)包含了文件类型、权限、长度等信息。
- 文件控制块(FCB,`struct FCB`)是文件夹或文件的通用结构体,包含类型标识、名称、打开状态以及指向父、兄弟和子节点的指针。
- 系统还维护了两个全局变量:根节点`root`和当前文件指针`fcp`,以及用于记录已打开文件和文件夹的两个数组,每个数组最多可容纳20个元素。
5. **函数接口**:
- `init()` 初始化根节点。
- `initopen()` 初始化打开文件列表。
- `creat()` 创建文件或目录。
- `delet()` 删除文件或目录,配合`delSub()`删除子树。
- `openfolder()` 和 `openfile()` 分别用于打开文件夹和文件。
- `closefo()` 和 `closefile()` 关闭文件夹和文件。
- `read()` 和 `write()` 实现文件的读取和写入操作。
- `show()` 显示初始界面。
- `initfile()` 可能是用于初始化文件相关设置的辅助函数。
这个文件管理系统设计考虑了实际操作系统的诸多要素,如文件权限管理、目录结构的构建以及文件操作的流程,是学习操作系统原理和实践编程能力的有效结合。