




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、滁州学院课程设计报告课程名称:计算机操作系统设计题目:多用户多级目录文件系统系 别:计算机科学与技术系专 业:计算机科学与技术专业组 别:第二组起止日期:2021年6月26日 2021年6月27日指导教师:陈海宝教研室主任:杨传健计算机科学与技术系 2021年制课程设计任务书课程设计题目多用户多级目录文件系统组长金松学号2021220060班级09系别计算机科学与技术系专业计算机科学与技术组员金松林勇波李长安姜新胡强刘永海何世峰指导教师陈海宝课程设计目的(1)掌握文件存储空间的治理(2)理解文件的物理结构(3)掌握目录结构的实现(4)掌握文件操作的实现课程设计所需环境 和工具软件环境: Win
2、dows XP/2000/2003 、Visual C+ 6.0硬件环境:CPU:至少Pentium100以上,建议使用 P4 2.0,内存:至少512M以上,硬盘:至少 60G硬盘空间课程设计任务要求实现多用户多级目录文件系统课程设计工作进度方案序号起止日期工作内容分工情况12021-12-15明确组内成员的工 作与任务姜新:概要设计,数据结构的设计 李长安:模块流程图的绘制22021-12-162021-12-17查阅资料、分析 题目、概要设计胡独: 金松: 林勇波: 刘永海: 何世峰: 模块的a用尸阳党求,乂什阳刚建、翻开阳惧吠夜叮 详细设计,文件的读,文件的写模块的设计查阅资料,文件的
3、关闭,删除模块的设计创立及目录,改变当前目录模块的设计系统运行调试,列出文件目录,退出系统 殳计32021-12-18详细设计、编码42021-12-19调试、运行、验 收52021-12-202021-12-22后续不断完善修改 等工作.教研室审核意见教研室主任签字年月日目录1 .设计思想说明 12 .系统结构说明 13 .数据结构说明 13.1 开发环境 13.2 数据存储 23.3 数据结构 23.3.1 数据块在内存中的物理结构 23.3.2 文件索引结构 23.3.3 文件系统中文件元素的结构含文件夹和文件 23.3.4 文件系统结构 33.3.5 文件系统的当前运行状态 33.3.
4、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 登录 175.2 新建目录和列出文件目
5、录 175.3 改变当前目录 175.4 文件的创立 185.5 文件的翻开 185.6 文件的写 185.7 文件的读 185.8 文件的关闭 185.9 文件的删除 195.10 返回根目录 195.11 退出 196 .心得体会 197 考文献 191 .设计思想说明本课程设计要求设计一个模拟的多用户多级目录的文件系统.通过具体的文件存储空间的治理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能 和实现过程的理解.2 .系统结构说明2.1 在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的 文件系统.2.2 文件物理结构可采用显式链接或其他方法.2
6、.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
7、删除文件: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即可,中间的局部用来存放文件
8、索引.其他用到的存储单元由系统分配.3.3 数据结构unsigned effect; FileIndexElement;3.3.3文件系统中文件元素的结构(含文件夹和文件)typedef struct fse(/文件块编号/文件块的容量/文件块地址/下一个文件块的地址3.3.1 数据块在内存中的物理结构typedef struct fb (unsigned FileBlockId;unsigned BLOCK_SIZE;char *FileBlockAddr;struct fb *next; FileBlock;3.3.2 文件索引结构typedef struct (unsigned Inde
9、x;char FileNameNAME_LEN;char ParentNameNAME_LEN;unsigned FileBlockId;unsigned FileLevel;/文件元素索引编号/文件元素名/父节点名/文件元素所在物理块编号/文件元素所在层次,层+文件元素名为一个文件元素逻辑位置/是否有效,0-无效,1-有效struct fse *parent;/指向自己的父亲节点/文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置/文件元素名/文件元素所在物理块编号/文件元素的长度/文件元素类型/文件元素可供操作的权限/文件创立者/创立时间,日期格式:MM/DD/YYHH:MI:SS/
10、最后一次修改时间/ 一个文件的数据开始地址,文件夹时该值为NULL/如果是一个文件表示文件当前的状态unsigned FileLevel;char FileNameNAME_LEN;unsigned FileBlockId;unsigned FileElemLen;FileType Type;FileAccess Access;User Creator;char CreateTime18;char LastModTime18;char *FileData;FileStatus fileStu; FSElement;3.3.4 文件系统结构typedef structchar *FSStart;
11、unsigned SuperBlockSize;BitMap bm;unsigned BLOCK_COUNT;FileBlock *head;FileIndex FI; SuperBlock;3.3.5 文件系统的当前运行状态/文件系统的起始地址/文件系统的容量/文件系统中的位示图/文件系统中文件块的数量/文件系统中文件块首地址/文件系统中的文件索引typedef structUser CurrentUser;unsigned FileLevel;FSElement *CurrParent; char *CurrentPath; CurrentStatus;/当前用户/用户所在文件系统层/当前
12、层的父节点/当前路径用户名称用户类型typedef struct(char *UserName;UserType ut; User;4 .各主要模块的算法流程图4.3 整体思路概述首先系统要完成初始化的任务,建立一个系统,并等待用户登录使用文件系统,用 户登录系统时,系统对用户的用户名和密码进行验证允许用户用限次的尝试,多最多 尝试五次,如果用户登录成功,那么系统进入命令提示符状态,等用户输入指令后,系 统得用一个解释程序根据指定方式处理用户请求,用户退出后,系统转入登录模块,等 待下一位用户的登录.4.1.1login 用户登录内置9个用户名和密码,用来验证登录用户的身份,用户登录成功后会初
13、始化当前 用户等一系列的系统当前信息,默认用户的类型为普通用户,如果用户未能通过身份验 证,提示用户登录失败,退出整个系统.用户登录流程图4.1.2 系统初始化系统的初始化要完成文件系统的建立,包括以下几局部:请求内存、设置位示图、 初始化文件索引、初始化文本块链表、初始化系统的当前状态、创立一个根目录做为系 统的根.4.1.3 文件的创立:create只支持在当前目录创立文件,根据位示图找到一个未使用的文件块用来存放用户的 文件信息,根据系统当前状态来构建一个文件系统元素放入到找到的文件块中,新创立 的文件状态为关闭,同时更新位示图和文件索引.文件创立流程图接收创立文件名称操 作 失 败建立
14、文件索引结点并初始化为文件分配要求的盘块建立文件结点并初始化销前面操作void Create(char *filename)(if (strcmp(filename, "") = 0)(printf(" 对不起,文件名不能为空.n");else(CreateFileElement(protect, filename, file, NULL, CS.CurrParent);printf("%slocalhost %s$, CS.CurrentUser.UserName, CS.CurrentPath);4.1.4 文件的翻开:open只支持在当前
15、目录进行操作,通过用户给定的文件名在文件索引中搜索到文件的物 理文件块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.FI.FIStarti.FileLevel = CS.FileLevel&& FS.FI.FIStarti.effect
16、 = 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, "") = 0)( strcpy(display,"当前目录下没有您要翻开的文件.n");prin
17、tf("%sn", display);printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath); 4.1.5文件的读:read只支持在当前目录进行操作,前提是用户已执行文件翻开的命令,否那么会提示用户 先翻开文件.通过类似的查找方式,找到文件的数据局部,将数据显示到界面.读文件流程图void Read(char *path)(char displayBLOCK_SIZE;for (unsigned i = 0; i < FS.FI.FICount; i+)(if (!str
18、cmp(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 *)FindBlankFileBlock(FS.FI.FIStarti.FileBlockId); if (fselem->fileSt
19、u = closed) ( strcpy(display,"文件尚未翻开,请先翻开文件.n"); else (if (!fselem->FileData | !strcmp(fselem->FileData, "")( strcpy(display,"文件无内容.n");elsestrcpy(display, fselem->FileData);)fselem->fileStu = reading;)break;)if (strcmp(display, "") = 0)(strcpy(dis
20、play,"当前目录下没有您要翻开的文件.n");)printf("%sn", display);printf("%slocalhost %s$, CS.CurrentUser.UserName, CS.CurrentPath);)4.1.6文件的写:write只支持在当前目录进行操作,前提是用户已执行文件翻开的命令,否那么会提示用户 先翻开文件.命令成功后,会等待用户的输入,用户输入完毕,使用CTRL+D结束输入, 系统会读入用户的输入内容,保存到相应的文件块(注意,如果用户的输入太多,会出 现越界或截取用户输入一局部的现象).void Wr
21、ite(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.FileLevel&& FS.FI.FIStarti.effect = 1&& strcmp(FS
22、.FI.FIStarti.FileName, path) = 0)(FSElement *fselem = (FSElement *)FindBlankFileBlock(FS.FI.FIStarti.FileBlockId);if (fselem->fileStu = closed)strcpy(display,文件尚未翻开,请先翻开文件n");) else ( printf("n 注意:文件最大不可以超过 %d字节! !按CTRL+站 束编辑.n", BLOCK_SIZE - sizeof(FSElement);char c;int i = 0;whil
23、e (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->FileData, display, len);fselem->fileStu = wri
24、ting;strcpy(display," 文件写入成功.n");) break;)printf("%sn", display);printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath);)4.1.7文件关闭:close只支持在当前目录进行操作,通过用户给定的文件名在文件索引中搜索到文件的物 理文件块ID,找到该文件元素后,将文件当前状态置为关闭.void Close(char *path)(char display100;for (unsigned i =
25、0; i < FS.Fl.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 *)FindBlankFileBlock(FS.FI.FISta
26、rti.FileBlockId);fselem->fileStu = opened;strcpy(display," 文件已关闭.n");break;if (strcmp(display, "") = 0)( strcpy(display,"当前目录下没有您要关闭的文件.n");printf("%sn", display);printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath); 4.1.8删除文件:delete
27、删除文件并不真正清理文件的物理存储内容,只是将文件的有效状态更改为无效删除文件流程图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 = CS.FileLevel&& FS.FI.FIStarti.effect = 1 &am
28、p;&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);printf("%slocalhost %s$", CS.CurrentUser.Use
29、rName, CS.CurrentPath);)4.1.9 创立目录(建立子目录): mkdir只支持在当前目录创立文件,与创立文件有点类似,只是文件夹在文件元素结构中 的数据局部为空.同样会更新位示图和文件索引.接收创立目录名称分配结点创立目录并初始化录创立失败目录创立成功创立目录流程图void Mkdir(char *filename)if (strcmp(filename, "") = 0)printf(" 对不起,文件夹名不能为空.n");)elseCreateFileElement(protect, filename, dir, NULL, C
30、S.CurrParent);)printf("%slocalhost %s$", CS.CurrentUser.UserName, CS.CurrentPath);)4.1.10 改变当前目录:cd只支持进入下一层的一个文件夹和回到父目录,实现方式为通过系统的当前状态, 获取一个指向目标文件夹的指针做为当前的父节点,改变当前的路径为目标路径,改变 用户当前所在层.按指针进入下级目录操作成功改变当前目录流程图void Cd(char *path)(int splitDisplayCou = 0;/分割符出现的次数if(strcmp(path, ".") =
31、 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 temppath1000;strcpy(temppath, CS.CurrentP
32、ath);memset(CS.CurrentPath, ''0', 1000);strncpy(CS.CurrentPath, temppath, i+1);) else ( char display100=""for (unsigned i = 0; i < FS.Fl.FICount; i+) (if(!strcmp(FS.FI.FIStarti.ParentName, CS.CurrParent->FileName)&& FS.FI.FIStarti.FileLevel = CS.FileLevel&&
33、; 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, "/"); break;)if (strcmp(displa
34、y, "") = 0)文件夹不存在,什么都不做(printf("当前目录下没有您要进入的文件夹.n");)printf("%slocalhost %s$, CS.CurrentUser.UserName, CS.CurrentPath); )4.1.11列出文件目录:dir只支持在当前目录进行操作,根据文件元素的名称+文件元素所在层+父节点可以 唯一的标识一个文件元素的关系在文件索引中搜索出当前层的所有文件元素.void Dir(char *path)(char display1000; memset(display, '0',
35、 1000);/查找显示内容for (unsigned i = 0; i < FS.Fl.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(display, "tt");printf(&qu
36、ot;%sn", display);printf("%slocalhost %s$, CS.CurrentUser.UserName, CS.CurrentPath); 4.1.12 退出:logout用户请求退出时,跳出命令处理,提示用户退出系统,转入到登录模块等待下一个 用户的登录.4.2算法流程图/' 程序入口点程序初始化1 O含分配内存空间2 .初始化位示图3 .初始化文件系统索引4 .初始化文本块5 .初始化系统的运行状态6 .创立一个根目录N|运行命令交互模块,处理用户的各种指令提示用户登录失败告知用户系统初始化失败清理资源,退出系统算法流程图5 .使用
37、说明书5.1 登录内置设了 useri到user8八个普通用户和1个超级用户root,密码与用户名相同.登录时 如果输入用户名和密码错误次数多于 8次,那么退出程序.输入密码时采用了一种不回显 的方式,虽然屏幕上没有显示输入的密码,其实密码已经输入了系统,这样做可以提升 系统的平安性.现在用超级用户root登录后出现如下界面:/表示根目录,$后面可以输 入命令.三 *C: Docu*ent s and Sett ings.Ad*inist rat in i'Oo trootSlocalliot /$图5.15.2 新建目录和列出文件目录由于第一次启动系统,故根目录下没有任何东西,这点可以通过输入命令dir来验证,故为了演示,先建立一个目录 hhh,在$后输入命令,mkdir hhh ,按回车,然后再用命令dir查看根目录下信息,此时有一个文件 hhh,如下:rooteiocalhostZJSdii-mkdir 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子商务平台上线进度保证措施
- 2025二年级语文上册课程标准教学计划
- 精神科病人藏药护理措施
- 和平区初一初二数学试卷
- 围手术期术中护理详解
- 海南高考题数学试卷
- 2025年中国塔式起重机市场研究与投资战略咨询报告
- 成品合作协议书范本
- 成都房租买卖协议书范本
- 粉笔新疆行测题库2024
- 2025年下半年江苏省南通市12345在线平台招聘重点基础提升模拟题带答案
- 2025至2030中国体育行业市场发展分析及前景趋势与投资机会报告
- 2025至2030水质分析仪产业市场发展分析及前景趋势与投资管理报告
- 2025杭州辅警考试真题
- 糖尿病视网膜病变临床诊疗指南
- 护理质量指标课件
- 2025至2030中国碳化硅(SiC)功率器件行业项目调研及市场前景预测评估报告
- 市场监管培训
- 职业院校生涯教育与就业指导体系构建研究
- 产品跟踪监测管理制度
- 2025年云南省高考化学试卷真题(含答案解析)
评论
0/150
提交评论