当前位置:文档之家› 操作系统课程设计---多用户多级目录文件系统的实现

操作系统课程设计---多用户多级目录文件系统的实现

课程设计报告课程名称:操作系统课程设计题目:多用户多级目录文件系统的实现姓名:系:专业:年级:学号:指导教师:职称:2011-2012学年第一学期目录1.设计思想说明 (1)2.系统结构说明 (1)3.数据结构说明 (2)3.1开发环境 (2)3.2数据存储 (2)3.3数据结构 (2)3.3.1数据块在内存中的物理结构 (2)3.3.2文件索引结构 (2)3.3.3文件系统中文件元素的结构(含文件夹和文件) (3)3.3.4文件系统结构 (3)3.3.5文件系统的当前运行状态 (4)3.3.6用户结构 (4)4.各主要模块的算法流程图 (4)4.1整体思路概述 (4)4.1.1login (用户登录) (4)4.1.2系统初始化 (5)4.1.3文件的创建: create (5)4.1.4文件的打开:open (6)4.1.5文件的读:read (7)4.1.6文件的写:write (8)4.1.7文件关闭:close (10)4.1.8删除文件:delete (10)4.1.9创建目录(建立子目录):mkdir (11)4.1.10改变当前目录:cd (12)4.1.11列出文件目录:dir (14)4.1.12退出:logout ......................... 错误!未定义书签。

4.2算法流程图................................... 错误!未定义书签。

5.使用说明书 (15)5.1登录 (15)5.2新建目录和列出文件目录 (16)5.3改变当前目录 (16)5.4文件的创建 (16)5.5文件的打开 (17)5.6文件的写 (17)5.7文件的读 (17)5.8文件的关闭 (17)5.9文件的删除 (17)5.10返回根目录 (18)5.11退出 (18)6.总结........................................... 错误!未定义书签。

参考文献. (1)课程设计题目名称1.设计思想说明本课程设计要求设计一个模拟的多用户多级目录的文件系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

2.系统结构说明2.1在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。

2.2文件物理结构可采用显式链接或其他方法。

2.3磁盘空闲空间的管理可选择位示图或其他方法。

如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。

2.4文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

2.5设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:2.5.1具有login (用户登录)2.5.2系统初始化(建文件卷、提供登录模块)2.5.3文件的创建: create2.5.4文件的打开:open2.5.5文件的读:read2.5.6文件的写:write2.5.7文件关闭:close2.5.8删除文件:delete2.5.9创建目录(建立子目录):mkdir2.5.10改变当前目录:cd2.5.11列出文件目录:dir2.5.12退出:logout3.数据结构说明3.1开发环境Visual C++6.0下的win32控制台程序,C语言。

3.2数据存储在内存中申请1M的空间来模拟存取设备,空间划分为三部分,第一部分用来存放位示图,用于标识数据块的使用情况,第二部分放置一个文件索引的数据,用于快速的查找数据,第三部分放置数据信息,第三部分划分为512块,每块512B,其256K,放置在1M空间的最末端,由第三部分的大小可知,第一部分只需64B即可,中间的部分用来存放文件索引。

其他用到的存储单元由系统分配。

3.3数据结构3.3.1数据块在内存中的物理结构typedef struct fb{unsigned FileBlockId; //文件块编号unsigned BLOCK_SIZE; //文件块的容量char *FileBlockAddr; //文件块地址struct fb *next; //下一个文件块的地址} FileBlock;3.3.2文件索引结构typedef struct{unsigned Index; //文件元素索引编号char FileName[NAME_LEN]; //文件元素名char ParentName[NAME_LEN]; //父节点名unsigned FileBlockId; //文件元素所在物理块编号unsigned FileLevel; //文件元素所在层次,层+文件元素名为一个文件元素逻辑位置unsigned effect; //是否有效,0-无效,1-有效} FileIndexElement;3.3.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:SSchar LastModTime[18]; //最后一次修改时间char *FileData; //一个文件的数据开始地址,文件夹时该值为NULLFileStatus fileStu; //如果是一个文件表示文件当前的状态} FSElement;3.3.4文件系统结构typedef struct{char *FSStart; //文件系统的起始地址unsigned SuperBlockSize; //文件系统的容量BitMap bm; //文件系统中的位示图unsigned BLOCK_COUNT; //文件系统中文件块的数量FileBlock *head; //文件系统中文件块首地址FileIndex FI; //文件系统中的文件索引} SuperBlock;3.3.5文件系统的当前运行状态typedef struct{User CurrentUser; //当前用户unsigned FileLevel; //用户所在文件系统层FSElement *CurrParent; //当前层的父节点char *CurrentPath; //当前路径} CurrentStatus;3.3.6用户结构typedef struct{char *UserName; //用户名称UserType ut; //用户类型} User;4.各主要模块的算法流程图4.1整体思路概述首先系统要完成初始化的任务,建立一个系统,并等待用户登录使用文件系统,用户登录系统时,系统对用户的用户名和密码进行验证(允许用户用限次的尝试,多最多尝试五次),如果用户登录成功,则系统进入命令提示符状态,等用户输入指令后,系统得用一个解释程序按照指定方式处理用户请求,用户退出后,系统转入登录模块,等待下一位用户的登录。

4.1.1login (用户登录)内置9个用户名和密码,用来验证登录用户的身份,用户登录成功后会初始化当前用户等一系列的系统当前信息,默认用户的类型为普通用户,如果用户未能通过身份验证,提示用户登录失败,退出整个系统。

用户登录流程图4.1.2系统初始化系统的初始化要完成文件系统的建立,包括以下几部分:请求内存、设置位示图、初始化文件索引、初始化文本块链表、初始化系统的当前状态、创建一个根目录做为系统的根。

4.1.3文件的创建: create只支持在当前目录创建文件,根据位示图找到一个未使用的文件块用来存放用户的文件信息,根据系统当前状态来构建一个文件系统元素放入到找到的文件块中,新创建的文件状态为关闭,同时更新位示图和文件索引。

文件创建流程图void Create(char *filename){if (strcmp(filename, "") == 0){printf("对不起,文件名不能为空。

\n");}else{CreateFileElement(protect, filename, file, NULL, CS.CurrParent);}printf("[%s@localhost %s]$", erName, CS.CurrentPath);}4.1.4文件的打开:open只支持在当前目录进行操作,通过用户给定的文件名在文件索引中搜索到文件的物理文件块ID,找到该文件元素后,将文件当前状态置为打开。

打开文件流程图void Open(char *path){char display[100];for (unsigned i = 0; i < FS.FI.FICount; i++){if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName)&& FS.FI.FIStart[i].FileLevel == CS.FileLevel&& FS.FI.FIStart[i].effect == 1&& strcmp(FS.FI.FIStart[i].FileName, path) == 0){FSElement *fselem = (FSElement *)FindBlankFileBlock(FS.FI.FIStart[i].FileBlo ckId);fselem->fileStu = opened;strcpy(display, "文件已打开完毕。

\n");break;}}if (strcmp(display, "") == 0){strcpy(display, "当前目录下没有您要打开的文件。

\n");}printf("%s\n", display);printf("[%s@localhost %s]$", erName, CS.CurrentPath);}4.1.5文件的读:read只支持在当前目录进行操作,前提是用户已执行文件打开的命令,否则会提示用户先打开文件。

相关主题