一、课程设计题目:
文件系统的模拟。
二、课程设计的目的:
利用学过的编程知识和编程技巧,结合操作系统原理中文件系统的基本结构
和原理,开发文件系统的模拟软件。要求该系统能实现如下功能:建立文件、打
开文件、读文件、写文件、关闭文件、删除文件、建立目录、显示目录内容、显
示文件内容、结束系统。
可以实现下列几条命令。
Login
Dir
Create
Delete
Open
Close
Read
Write
用户登录
列文件目录
创建文件
删除文件
打开文件
关闭文件
读文件
写文件
三、课程设计的开发语言:
Windows 操作系统
Microsoft Visual
C++
四、功能描述:
首先系统要完成初始化的任务,建立一个系统,并等待用户登录使用文件系
统,用户登录系统时,系统对用户的用户名和密码进行验证(允许用户有限次的
尝试,最多尝试五次),如果用户登录成功,则系统进入命令提示符状态,等用
户输入指令后,系统得用一个解释程序按照指定方式处理用户请求,用户退出后,
系统转入登录模块,等待下一位用户的登录。实现一般的创建文件、目录,删除
文件、目录,切换目录,打开、关闭文件、读写文件等操作。
五、方案论证:
5.1 概要设计
5.1.1 login (用户登录)
内置 9 个用户名和密码,用来验证登录用户的身份,用户登录成功后会初始化当
前用户等一系列的系统当前信息,默认用户的类型为普通用户,如果用户未能通
过身份验证,提示用户登录失败,退出整个系统。
图 1 用户登录流程图
5.1.2 系统初始化
系统的初始化要完成文件系统的建立,包括以下几部分:请求内存、设置位
示图、初始化文件索引、初始化文本块链表、初始化系统的当前状态、创建一个
根目录做为系统的根。
5.1.3 文件的创建: create
只支持在当前目录创建文件,根据位示图找到一个未使用的文件块用来存放
用户的文件信息,根据系统当前状态来构建一个文件系统元素放入到找到的文件
块中,新创建的文件状态为关闭,同时更新位示图和文件索引。
图 2 文件创建流程图
5.1.4 文件的打开:open
只支持在当前目录进行操作,通过用户给定的文件名在文件索引中搜索到文
件的物理文件块 ID,找到该文件元素后,将文件当前状态置为打开。
图 3 打开文件流程图
5.1.5 文件的读:read
只支持在当前目录进行操作,前提是用户已执行文件打开的命令,否则会提
示用户先打开文件。通过类似的查找方式,找到文件的数据部分,将数据显示到
界面。
图 4 读文件流程图
5.1.6 文件的写:write
只支持在当前目录进行操作,前提是用户已执行文件打开的命令,否则会提
示用户先打开文件。命令成功后,会等待用户的输入,用户输入完毕,使用
CTRL+D,结束输入,系统会读入用户的输入内容,保存到相应的文件块(注意,
如果用户的输入太多,会出现越界或截取用户输入一部分的现象)。
5.1.7 文件关闭:close
只支持在当前目录进行操作,通过用户给定的文件名在文件索引中搜索到文
件的物理文件块 ID,找到该文件元素后,将文件当前状态置为关闭。
5.1.8 删除文件:delete
删除文件并不真正清理文件的物理存储内容,只是将文件的有效状态更改为
无效。
图 5 删除文件流程图
5.1.9 创建目录(建立子目录):mkdir
只支持在当前目录创建文件,与创建文件有点类似,只是文件夹在文件元素
结构中的数据部分为空。同样会更新位示图和文件索引。
图 6 创建目录流程图
5.1.10 改变当前目录:cd
只支持进入下一层的一个文件夹和回到父目录,实现方式为通过系统的当前
状态,获取一个指向目标文件夹的指针做为当前的父节点,改变当前的路径为目
标路径,改变用户当前所在层。
图 7 改变当前目录流程图
5.1.11 列出文件目录:dir
支持在当前目录进行操作,根据文件元素的名称+文件元素所在层+父节点
可以唯一的标识一个文件元素的关系在文件索引中搜索出当前层的所有文件元
素。
5.1.12 退出:logout
用户请求退出时,跳出命令处理,提示用户退出系统,转入到登录模块等待下一
个用户的登录。
5.1.13 算法流程图
图 8 算法流程图
5.2、详细设计
各功能数据结构
5.2.1 数据块在内存中的物理结构
typedef struct fb
{
unsigned FileBlockId;
//文件块编号
unsigned BLOCK_SIZE;
//文件块的容量
char *FileBlockAddr;
//文件块地址
struct fb *next;
//下一个文件块的地址
} FileBlock;
5.2.2 文件索引结构
typedef struct
{
unsigned Index;
//文件元素索引编号
char FileName[NAME_LEN];
//文件元素名
char ParentName[NAME_LEN];
//父节点名
unsigned FileBlockId;
//文件元素所在物理块编号
unsigned FileLevel;
//文件元素所在层次,层+文件元素
名为一个文件元素逻辑位置
unsigned effect;
//是否有效,0-无效,1-有效
} FileIndexElement;
5.2.3 文件系统中文件元素的结构(含文件夹和文件)
typedef struct fse
{
struct fse *parent;
//指向自己的父亲节点
unsigned FileLevel;
//文件元素所在层次,层+文件元素名
为一个文件元素的逻辑位置
char FileName[NAME_LEN];
//文件元素名
unsigned FileBlockId;
//文件元素所在物理块编号
unsigned FileElemLen;
//文件元素的长度
FileType Type;
//文件元素类型
FileAccess Access;
//文件元素可供操作的权限
User Creator;
//文件创建者
char CreateTime[18];
//创建时间,日期格式:MM/DD/YY
HH:MI:SS
char LastModTime[18];
//最后一次修改时间
char *FileData;
//一个文件的数据开始地址,文件夹时该值为
NULL
FileStatus fileStu;
//如果是一个文件表示文件当前的状态
} FSElement;
5.2.4 文件系统结构