(完整word版)多用户多级目录文件系统(第二组)_第1页
(完整word版)多用户多级目录文件系统(第二组)_第2页
(完整word版)多用户多级目录文件系统(第二组)_第3页
(完整word版)多用户多级目录文件系统(第二组)_第4页
(完整word版)多用户多级目录文件系统(第二组)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、滁州学院课程设计报告课程名称:计算机操作系统设计题目:多用户多级目录文件系统系 别:计算机科学与技术系专 业:计算机科学与技术专业组 别:第二组起止日期:2010年6月26日 2010年6月27日指导教师:陈海宝教研室主任:杨传健计算机科学与技术系 2010年制课程设计任务书课程设计题目多用户多级目录文件系统组长金松学号2009220060班级09系别计算机科学与技术系专业计算机科学与技术组员金松林勇波李长安姜新胡强刘永海何世峰指导教师陈海宝课程设计目的(1)掌握文件存储空间的管理(2)理解文件的物理结构(3)掌握目录结构的实现(4)掌握文件操作的实现课程设计所需环境 和工具软件环境: Win

2、dows XP/2000/2003 、Visual C+ 6.0硬件环境:CPU:至少Pentium100以上,建议使用 P4 2.0,内存:至少512M以上,硬盘:至少 60G硬盘空间课程设计任务要求实现多用户多级目录文件系统课程设计工作进度计划序号起止日期工作内容分工情况12009-12-15明确组内成员的工 作与任务姜新:概要设计,数据结构的设计 李长安:模块流程图的绘制22009-12-162009-12-17查阅资料、分析 题目、概要设计胡独: 金松: 林勇波: 刘永海: 何世峰: 模块的a用尸阳党求,乂仕阳刚建、打开阳惧吠夜叮 详细设计,文件的读,文件的写模块的设计查阅资料,文件的

3、关闭,删除模块的设计创建及目录,改变当前目录模块的设计系统运行调试,列出文件目录,退出系统 殳计32009-12-18详细设计、编码42009-12-19调试、运行、验 收52009-12-202009-12-22后续不断完善修改 等工作。教研室审核意见教研室主任签字年月日3目录1 . 设计思想说明 12 .系统结构说明 13 .数据结构说明 13.1 开发环境 13.2 数据存储 23.3 数据结构 23.3.1 数据块在内存中的物理结构 23.3.2 文件索引结构 23.3.3 文件系统中文件元素的结构(含文件夹和文件) 23.3.4 文件系统结构 33.3.5 文件系统的当前运行状态 3

4、3.3.6 用户结构 44 .各主要模块的算法流程图 44.1 整体思路概述 44.1.1 gin ( 用户登录 ) 44.1.2 系统初始化 54.1.3 文件的创建: create 54.1.4 文件的打开: open 64.1.5 文件的读:read 64.1.6 文件的写:write 84.1.7 文件关闭:close 94.1.8 删除文件:delete 104.1.9 创建目录(建立子目录): mkdir 124.1.10 改变当前目录:cd 124.1.11 列出文件目录:dir 144.1.12 退出: logout 154.2 算法流程图 165 .使用说明书 175.1 登

5、录 175.2 新建目录和列出文件目录 175.3 改变当前目录 175.4 文件的创建 185.5 文件的打开 185.6 文件的写 185.7 文件的读 185.8 文件的关闭 185.9 文件的删除 195.10 返回根目录 195.11 退出 196 .心得体会 19参考文献 1921 .设计思想说明本课程设计要求设计一个模拟的多用户多级目录的文件系统。 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。2 . 系统结构说明2.1 在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。2.2 文件

6、物理结构可采用显式链接或其他方法。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 文件的写:wri

7、te2.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空间的最末端,由第三部分的大

8、小可知,第一部分只需 64B即可,中间的部分 用来存放文件索引。其他用到的存储单元由系统分配。3.3 数据结构3/ 文件块编号/ 文件块的容量/ 文件块地址/ 下一个文件块的地址3.3.1 数据块在内存中的物理结构typedef struct fbunsigned FileBlockId;unsigned BLOCK_SIZE;char *FileBlockAddr;struct fb *next; FileBlock;3.3.2 文件索引结构typedef structunsigned Index;char FileNameNAME_LEN;char ParentNameNAME_LEN;u

9、nsigned FileBlockId;unsigned FileLevel;unsigned effect; FileIndexElement;3.3.3 文件系统中文件元素的结构(含文件夹和文件)typedef struct fse/ 文件元素索引编号/文件元素名/父节点名/ 文件元素所在物理块编号/ 文件元素所在层次,层文件元素名为一个文件元素逻辑位置/ 是否有效, 0-无效, 1-有效struct fse *parent;/ 指向自己的父亲节点/ 文件元素所在层次,层文件元素名为一个文件元素的逻辑位置/ 文件元素名/ 文件元素所在物理块编号/ 文件元素的长度/ 文件元素类型/ 文件元素

10、可供操作的权限/ 文件创建者/ 创建时间, 日期格式: MM/DD/YYHH:MI:SS/ 最后一次修改时间/ 一个文件的数据开始地址, 文件夹时该值为 NULL/ 如果是一个文件表示文件当前的状态unsigned FileLevel;char FileNameNAME_LEN;unsigned FileBlockId;unsigned FileElemLen;FileType Type;FileAccess Access;User Creator;char CreateTime18;char LastModTime18;char *FileData;FileStatus fileStu; F

11、SElement;3.3.4 文件系统结构typedef structchar *FSStart;unsigned SuperBlockSize;BitMap bm;unsigned BLOCK_COUNT;FileBlock *head;FileIndex FI; SuperBlock;3.3.5 文件系统的当前运行状态/ 文件系统的起始地址/ 文件系统的容量/ 文件系统中的位示图/ 文件系统中文件块的数量/ 文件系统中文件块首地址/ 文件系统中的文件索引typedef structUser CurrentUser;unsigned FileLevel;FSElement *CurrPare

12、nt; char *CurrentPath; CurrentStatus;/ 当前用户/ 用户所在文件系统层/ 当前层的父节点/ 当前路径3.3.6用户结构用户名称用户类型typedef structchar *UserName;UserType ut; User;44 .各主要模块的算法流程图4.1 整体思路概述首先系统要完成初始化的任务,建立一个系统,并等待用户登录使用文件系统,用 户登录系统时,系统对用户的用户名和密码进行验证(允许用户用限次的尝试,多最多 尝试五次),如果用户登录成功,则系统进入命令提示符状态,等用户输入指令后,系 统得用一个解释程序按照指定方式处理用户请求,用户退出后

13、,系统转入登录模块,等 待下一位用户的登录。4.1.1login ( 用户登录)内置9个用户名和密码,用来验证登录用户的身份,用户登录成功后会初始化当前 用户等一系列的系统当前信息,默认用户的类型为普通用户,如果用户未能通过身份验 证,提示用户登录失败,退出整个系统。用户登录流程图4.1.2 系统初始化系统的初始化要完成文件系统的建立,包括以下几部分:请求内存、设置位示图、 初始化文件索引、初始化文本块链表、初始化系统的当前状态、创建一个根目录做为系 统的根。4.1.3 文件的创建:create只支持在当前目录创建文件,根据位示图找到一个未使用的文件块用来存放用户的 文件信息,根据系统当前状态

14、来构建一个文件系统元素放入到找到的文件块中,新创建 的文件状态为关闭,同时更新位示图和文件索引。文件创建流程图接收创建文件名称操 作 失 败建立又件索引结点并初始化为文件分配要求的盘块建立文件结点并初始化销前面操作void Create(char *filename)if (strcmp(filename, "") = 0)printf(" 对不起,文件名不能为空。n");elseCreateFileElement(protect, filename, file, NULL, CS.CurrParent);printf("%slocalhost

15、 %s$”, CS.CurrentUser.UserName, CS.CurrentPath);4.1.4 文件的打开:open只支持在当前目录进行操作,通过用户给定的文件名在文件索引中搜索到文件的物 理文件块ID,找到该文件元素后,将文件当前状态置为打开。打开文件流程图void Open(char *path)char display100;for (unsigned i = 0; i < FS.FI.FICount; i+) if (!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName)&& FS.

16、FI.FIStarti.FileLevel = CS.FileLevel&& FS.FI.FIStarti.effect = 1&& strcmp(FS.FI.FIStarti.FileName, path) = 0) FSElement *fselem = (FSElement *)FindBlankFileBlock(FS.FI.FIStarti.FileBlockId);fselem->fileStu = opened;strcpy(display,"文件已打开完毕。n");break;if (strcmp(display, &q

17、uot;") = 0) strcpy(display,"当前目录下没有您要打开的文件。n");printf("%sn", display);printf("%slocalhost %s$”, CS.CurrentUser.UserName, CS.CurrentPath); 4.1.5文件的读:read只支持在当前目录进行操作,前提是用户已执行文件打开的命令,否则会提示用户 先打开文件。通过类似的查找方式,找到文件的数据部分,将数据显示到界面。读文件流程图void Read(char *path)char displayBLOCK_S

18、IZE;for (unsigned i = 0; i < FS.FI.FICount; i+)if (!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName) && FS.FI.FIStarti.FileLevel = CS.FileLevel&& FS.FI.FIStarti.effect = 1&&strcmp(FS.FI.FIStarti.FileName, path) = 0)FSElement *fselem = (FSElement *)FindBlankFil

19、eBlock(FS.FI.FIStarti.FileBlockId); if (fselem->fileStu = closed) strcpy(display,"文件尚未打开,请先打开文件。n"); else if (!fselem->FileData | !strcmp(fselem->FileData, "") strcpy(display,"文件无内容。n");elsestrcpy(display, fselem->FileData);fselem->fileStu = reading;break

20、;if (strcmp(display, "") = 0)strcpy(display, " 当前目录下没有您要打开的文件。 n");printf("%sn", display);printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath);4.1.6 文件的写: write只支持在当前目录进行操作,前提是用户已执行文件打开的命令,否则会提示用户先打开文件。 命令成功后, 会等待用户的输入, 用户输入完毕, 使用CTRL+D, 结束输入,系统会

21、读入用户的输入内容,保存到相应的文件块(注意,如果用户的输入太多,会出现越界或截取用户输入一部分的现象)。void Write(char *path)char displayBLOCK_SIZE;memset(display, '0', BLOCK_SIZE);for (unsigned i = 0; i < FS.FI.FICount; i+)if (!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName)&& FS.FI.FIStarti.FileLevel = CS.FileLeve

22、l&& FS.FI.FIStarti.effect = 1&& strcmp(FS.FI.FIStarti.FileName, path) = 0)FSElement *fselem = (FSElement *)FindBlankFileBlock(FS.FI.FIStarti.FileBlockId);if (fselem->fileStu = closed)strcpy(display,文件尚未打开,请先打开文件。n");elseprintf("n 注意:文件最大不可以超过 d字节! !按CTRL+站 束编辑。 n",

23、BLOCK_SIZE - sizeof(FSElement);char c;int i = 0;while (c = getchar() != 0x04)displayi+ = c;getchar(); / 处理回车displayi = '0'strcpy(fselem->FileData, display);unsigned len=strlen(display)<BLOCK_SIZE - sizeof(FSElement) ? strlen(display) : BLOCK_SIZE - sizeof(FSElement);strncpy(fselem->

24、FileData, display, len);fselem->fileStu = writing;strcpy(display, " 文件写入成功。 n"); break;printf("%sn", display);printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath);4.1.7 文件关闭: close只支持在当前目录进行操作, 通过用户给定的文件名在文件索引中搜索到文件的物理文件块 ID ,找到该文件元素后,将文件当前状态置为关闭。void C

25、lose(char *path)char display100;for (unsigned i = 0; i < FS.FI.FICount; i+)if (!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName)&& FS.FI.FIStarti.FileLevel = CS.FileLevel&& FS.FI.FIStarti.effect = 1&& strcmp(FS.FI.FIStarti.FileName, path) = 0) FSElement *fsele

26、m = (FSElement *)FindBlankFileBlock(FS.FI.FIStarti.FileBlockId);fselem->fileStu = opened;strcpy(display, " 文件已关闭。 n");break;if (strcmp(display, "") = 0)strcpy(display, " 当前目录下没有您要关闭的文件。 n");printf("%sn", display);printf("%slocalhost %s$", CS.Curre

27、ntUser.UserName, CS.CurrentPath); 4.1.8 删除文件: delete删除文件并不真正清理文件的物理存储内容,只是将文件的有效状态更改为无效。删除文件流程图void Delete(char *path) char display100=""for (unsigned i = 0; i < FS.FI.FICount; i+) if (!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName) && FS.FI.FIStarti.FileLevel = C

28、S.FileLevel&& FS.FI.FIStarti.effect = 1 &&strcmp(FS.FI.FIStarti.FileName, path) = 0) FS.FI.FIStarti.effect = 0;/ 删除标记strcpy(display," 文件已删除。n"); break;if (strcmp(display, "") = 0) strcpy(display,"当前目录下没有您要删除的文件。n"); printf("%sn", display);print

29、f("%slocalhost %s$”, CS.CurrentUser.UserName, CS.CurrentPath);4.1.9 创建目录(建立子目录): mkdir只支持在当前目录创建文件,与创建文件有点类似,只是文件夹在文件元素结构中 的数据部分为空。同样会更新位示图和文件索引。接收创建目录名称分配结点创建目录并初始化录创建失败目录创建成功创建目录流程图void Mkdir(char *filename)if (strcmp(filename, "") = 0)printf(" 对不起,文件夹名不能为空。n");elseCreateF

30、ileElement(protect, filename, dir, NULL, CS.CurrParent);printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath);4.1.10 改变当前目录:cd只支持进入下一层的一个文件夹和回到父目录,实现方式为通过系统的当前状态, 获取一个指向目标文件夹的指针做为当前的父节点,改变当前的路径为目标路径,改变 用户当前所在层。按指针进入下级目录操作成功改变当前目录流程图void Cd(char *path)int splitDisplayCou = 0;/分

31、割符出现的次数if(strcmp(path, ".") = 0) /返回上一级目录,即父目录if (CS.FileLevel > 0)CS.FileLevel-;CS.CurrParent = CS.CurrParent->parent;for (unsigned i = strlen(CS.CurrentPath) - 1; i > 0; i-) if (CS.CurrentPathi = '/')splitDisplayCou+;if (splitDisplayCou = 2)/已过滤掉最后一个目录名break;char temppat

32、h1000;strcpy(temppath, CS.CurrentPath);memset(CS.CurrentPath, ''0', 1000);strncpy(CS.CurrentPath, temppath, i+1); elsechar display100 = ""for (unsigned i = 0; i < FS.FI.FICount; i+) if(!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName)&& FS.FI.FIStarti.Fi

33、leLevel = CS.FileLevel&& FS.FI.FIStarti.effect = 1&& strcmp(FS.FI.FIStarti.FileName, path) = 0) strcpy(display, " 文件存在。 n");CS.CurrParent = (FSElement *)FindBlankFileBlock(FS.FI.FIStarti.FileBlockId);CS.FileLevel+;strcat(CS.CurrentPath, path);strcat(CS.CurrentPath, "/&

34、quot;); break;if (strcmp(display, "") = 0)/ 文件夹不存在,什么都不做printf(" 当前目录下没有您要进入的文件夹。 n"); printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath);4.1.11 列出文件目录: dir只支持在当前目录进行操作, 根据文件元素的名称文件元素所在层父节点可以 唯一的标识一个文件元素的关系在文件索引中搜索出当前层的所有文件元素。void Dir(char *path)char dis

35、play1000;memset(display, '0', 1000);/ 查找显示内容for (unsigned i = 0; i < FS.FI.FICount; i+)if (!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName)&& FS.FI.FIStarti.FileLevel = CS.FileLevel&& FS.FI.FIStarti.effect = 1)strcat(display, FS.FI.FIStarti.FileName);strcat(d

36、isplay, "tt");printf("%sn", display);printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath); 4.1.12 退出: logout用户请求退出时,跳出命令处理,提示用户退出系统,转入到登录模块等待下一个用户的登录。144.2算法流程图16NI/' 程序入口点程序初始化1 O含分配内存空间2 .初始化位示图3 .初始化文件系统索引4 .初始化文本块5 .初始化系统的运行状态6 .创建一个根目录运行命令交互模块,处理用

37、户的各种指令提示用户登录失败告知用户系统初始化失败清理资源,退出系统算法流程图5 .使用说明书5.1 登录三 *C: Docu*ent s and Sett ings.Ad*inist rat内置设了 useU到user8八个普通用户和1个超级用户root,密码与用户名相同。登录时 如果输入用户名和密码错误次数多于 8次,则退出程序。输入密码时采用了一种不回显 的方式,虽然屏幕上没有显示输入的密码,其实密码已经输入了系统,这样做可以提高 系统的安全性。现在用超级用户root登录后出现如下界面:/表示根目录,$后面可以输 入命令。lo<J in i'Oo t passv?o t'd"rootSlocalliot /$图5.15.2 新建目录和列出文件目录由于第一次启动系统,故根目录下没有任何东西,这点可以通过输入命令dir来验证,故为了演示,先建立一个目录 hhh,在$后输入命令,mkdir hhh ,按回车,然后再用命令dir查看根目录下信息,此时有一个文件 hhh,如下:rooteiocalhostZJSdii-21mkdir hh>i / JSdirErootPlocalhct Croat I? localhost hhhL rootPlocalhost图5.25.3 改变当前目录系统启动后,默认路径为根目录/,此时若要进入刚

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论