《操作系统》课程设计--模拟文件管理系统.doc_第1页
《操作系统》课程设计--模拟文件管理系统.doc_第2页
《操作系统》课程设计--模拟文件管理系统.doc_第3页
《操作系统》课程设计--模拟文件管理系统.doc_第4页
《操作系统》课程设计--模拟文件管理系统.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

河海大学操作系统课程设计设计名称: 模拟文件管理系统 课程设计负责人: 课程设计成员: 河海大学计算机与信息学院二一一年十二月目录Contents第一部分:课程设计目的3第二部分:设计要求3第三部分:运行环境3第四部分:实验内容441前期知识巩固442设计任务543详细设计部分10431数据结构10432主要函数11433系统流程图11第五部分:调试分析1351用户登录1352创建文件1453查看文件1554删除文件1555修改文件夹位置16第六部分:参考文献16第七部分:附录1771心得体会1772源代码(代码文字已缩小)17第一部分:课程设计目的本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。具体指在内存中开辟一个虚拟的磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。在退出这个文件系统时应将该文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。第二部分:设计要求(1)对进行认真分析,列出实验具体步骤,写出符合题目要求的程序清单,准备出调试程序使用的数据。(2)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。(3)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。(4)文件保护简单使用三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。(5)以完整的论文形式提交原始代码、设计文档和可运行程序。提交的文档应当包括:设计题目,程序清单,运行结果分析,算法及其优缺点,以及通过上机取得了哪些经验。程序清单要求格式规范,注意加注释(包含关键字、方法、变量等),在每个模块前加注释。(6)本组交一份设计文档的同时每名组员交一份实践体会。第三部分:运行环境windows xp 系统,windows 7 旗舰版系统编译器:Microsoft Visual C+ 6.0编辑语言:c+第四部分:实验内容41前期知识巩固A、文件系统: 文件系统是操作系统的五大功能模块之一,主要实现操作系统对程序、数据、设备等的管理。文件系统的主要功能:完成文件存储空间管理,实现文件名到物理地址的映射,实现文件和目录的操作管理,提供文件共享能力和安全措施等功能。B、文件文件是信息的一种组织形式,是存储在外存上的带有标识号的一组相关信息的集合,而这个集合既可以由相关联的字符流组成,也可以由相关联的记录组成。文件的构成:文件控制块(FCB)、数据。FCB是系统在管理文件时所需信息的数据结构,是文件存在的惟一标志。包括了文件的基本属性,大致有文件名、地址、存取控制信息(如文件所有者、同组用户、访问权限)以及使用信息(如创建日期、修改日期)。C、文件目录文件控制块的有序集合称为文件目录。文件目录的基本功能是实现文件名与其存放位置的映射。D、文件的物理结构常用的结构有顺序结构、链接结构、文件分配表结构FAT、索引结构、多级索引结构。E、文件操作 文件的操作就是创建/删除文件、打开/关闭文件、读/写文件等F、磁盘空间管理文件系统的一个重要任务是对磁盘空间进行管理。磁盘空间管理的关键问题是磁盘空闲空间的管理。常用的空闲块管理方法有:空闲文件目录法、空闲块链法、位示图法、空闲块成组链接法。42设计任务建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统。a、 在现有机器硬盘上开辟1M的硬盘空间,模拟作为作为设定的硬盘空间。b、 编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求:(1) 盘块大小1k (2) 空闲盘块的管理:Linux位图法(3) 结构:超级块, i结点区, 根目录区c、 该文件管理程序的功能要求如下:Format:对文件存储器进行格式化 mkdir:用于创建子目录 dir:用于显示目录 cd:更改当前目录create:创建文件write:写文件 read:读文件 del:删除文件access: 权限d、 程序的总体流程为:(1) 初始化文件目录;(2) 输出提示符,等待接受命令,分析键入的命令;(3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。总体流程图如下所示: 是登录输入命令退出退出失败成功否启动执行命令以下是各功能模块流程图:初始化当前状态读入i节点信息到内存当前目录为根目录初始化超级块结束开始初始化函数format ( ) 是是否否遍历i节点区argv1=”.”目录是否存在找到的目录i节点号送当前目录inum_cur当前目录的父i节点号送当前目录inum_cur开始结束改变当前目录cd()是是否否遍历i节点区i节点的父节点是否为当前目录i节点区是否遍历完输出文件名或目录名开始结束显示目录dir()是是否否遍历i节点区要创建的目录是否存在是否有空的i节点遍历i节点区分配一个目录i节点开始结束创建目录mkdir()是是否否遍历目录索引要创建的文件是否存在是否有空的i节点遍历i节点区分配一个文件i节点开始结束创建文件creat()是否遍历i节点区要删除的文件是否存在释放文件对应的i节点区effect=0开始结束删除文件del()是否是否是否遍历i节点区要打开的文件是否存在提示输入打开模式将打开文件信息写入打开文件信息表file_array遍历打开文件表file_array文件是否已经打开提示输入开始位置和读字节数调用读块操作,读出块内字符模式是否为可读开始结束开始结束打开文件open()读文件read()是否是否遍历打开文件表file_array文件是否已经打开提示输入写入字节数调用写块操作,写入块内字符模式是否为可写是否遍历打开文件表file_array文件是否已经打开将打开文件表项标志位置-1file_arrayi.inum = -1开始结束写文件write()开始结束关闭文件close()开始遍历i节点区是待删除目录吗?遍历子目录子目录为空吗?是文件吗?是空目录吗?结束调用delet()删除目录或文件是空目录吗?删除目录树rd()是是否否否否否是是是开始当前是否有该文件是否为管理员是否为普通用户是公用么结束判断权限access()是否否否查找该文件是是有读写权限查找该文件是是否遍历位示图表查找空闲块bitmap是否有空闲块分配一块,将位示图位置置1。 bitmapi = 1返回找到的空闲块号将位示图位置置0。 bitmapi = 0清空块内容开始结束分配磁盘块get_blk()开始结束释放磁盘块release_blk(int)是否输出给定i节点对应的第1块内容文件是否大于1块输出给定i节点对应的第2块内容是否将缓冲区buf内容写入第1块buf内容是否大于512字节将缓冲区buf的512字节后面的内容写入第2块开始结束写磁盘块write_blk(int)开始结束读磁盘块read_blk(int)43详细设计部分431数据结构定义功能描述数据结构typedef enum FileAccess文件元素可供操作性权限typedef enum FileType文件元素类型typedef enum UserType用户类型typedef enum FileStatus文件状态typedef struct FileIndexElement一个文件索引结构typedef struct FileIndex文件索引结构或目录表项typedef struct fb FileBlock文件块的结构typedef struct BitMap文件系统的位示图结构typedef struct SuperBlock;文件系统结构typedef struct User用户信息typedef struct fse FSElement文件系统中的元素结构,包括文件和文件夹typedef struct CurrentStatus系统当前状态432主要函数定义功能描述函数unsigned FindBlankFileBlockId()char * FindBlankFileBlock(unsigned fileblockid)寻找第一个文件块地址void GetCurrentTime(char *currtime)得到当前时间的字符串void AddFileIndex(unsigned fileblockid, unsigned filelevel, char *filename, char *parentname,FileType temp)更新文件索引void UpdateBitMap(unsigned fileblockid)更新位示图FSElement CreateFileElement(FileAccess acc, char *filename, FileType type, char *filecontent, FSElement *parent)创建一个文件元素FileBlock * CreateFileBlockList(char *datahead, unsigned blockcap, unsigned len)创建文件块链表bool InitFileSys()初始化模拟文件系统bool Login()void Create(char *filename)系统登录模块创建一个文件void Dir(char *path)列出当前目录的文件和文件夹void Mkdir(char *filename)创建一个文件夹void Cd(char *path)进入一个文件夹void Delete(char *path)删除当前目录的文件void FindCommKey(char *command, char *key, char *path)命令分解void Shell()命令解释模块void ClearFileSys(退出时清理分配的内存空间433系统流程图(1)Login 用户登录用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。(2)format 格式化初始化超级块,初始化主目录,初始化管理员admin 目录,初始化用户目录,初始化 用户passwd文件。(3)create 创建文本文件查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以#结束。申请硬盘空间,申请失败则结束。将文件内容写入硬盘空间。修改当前目录的结构,修改超级块。(4)cdir 创建文件夹查找当前目录下是否有同名文件,是则退出,否则,申请硬盘空间,申请失败则结束。将文件夹内容写入硬盘空间。修改当前目录的结构,修改超级块,写入模拟硬盘。(5)read edit 读取和追加文本文件(6)Read-查找当前目录下是否该文件,没有则退出,否则调用access()权限判断,有权限则判断是不是文件,不是则退出,是文件则读取文件并显示。(7)Edit-调用读取文件模块,读取成功则用户输入追加的内容,如果追加的内容大于一个硬盘分配空间则申请分配空间,失败则退出,申请成功则保存文件。(8)access(文件名) 权限判断先判断当前目录是否有该文件,在当前目录的硬盘空间找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。如果是该用户创建的 则有读写权限如果当前用户是管理员组的 也具有读写权限如果该文件是用户可查看文件则都具有权限。(9)cd 进入子目录 或上级目录查找当前目录是否有该子目录,没有则退出,调用access()判断当前用户是否有权限,无则退出,有则读取该子目录的目录,将当前目录指向该目录。(10)attr(文件名)查看文件或者文件夹的属性先查找当前目录下是否有该文件或目录,有则判断文件是否系统文件,是否文本文件,是否目录,由谁创建,属于什么组,占用的空间和目录。将其全部显示出来。(11)del 删除文件或目录查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。提示用户是否删除,确认则删除文件,修改当前文件夹目录和硬盘空间结构,修改超级块,写入模拟硬盘。(12)Dir 列文件目录(列出文件名、物理地址、保护码和文件长度)第五部分:调试分析51用户登录初始登陆界面,根据注册用户的信息,每次登陆有三次登陆机会,如果失败即结束并退出,用户名和验证码与注册的信息一致则进入系统,下图显示的是登陆时失败的画面:登陆成功后画面显示:52创建文件创建文件并输入文件内容,我们的创建文件模式为“CREAT +文件名称”,下图的名称为123,之后系统显示输入文件内容,同时会提醒内容以“#”结尾,此便于系统识别,具体画面如下所示:下面是创建文件夹,文件夹不需要输入文件信息。53查看文件根据之前创建的文件,可以查看当前文件夹中已经创建文件的信息。命令“dir”。54删除文件 创建文件夹并删除,创建文件夹的命令为“CDIR+文件夹名称”,下图以123为例;删除命令为DEL+文件夹名称/文件名称,下图还以AAA文件夹为例,如下图所示:删除后查看,可以验证文件已经删除。55修改文件夹位置第六部分:参考文献1 罗宇等 . 操作系统(第2版).电子工业出版社2 谭浩强 .C+程序设计.清华大学出版社3 宁正元等 . 算法与数据结构.清华大学出版社4 林锐 . 高质量程序设计.电子工业出版社5 张乃孝 .算法与数据结构-c语言描述(第二版).高等教育出版社6 严蔚敏等.数据结构(C语言版).清华大学出版社7 苏仕华等.数据结构课程设计.机械工业出版社8 /ds/ds2/wangshangketang/index.htm第七部分:附录71心得体会在本次课程设计刚刚开始时,不知道怎么设计,只知道大概的结构。后来认真阅读课本有关的知识,知道怎样设计结构体才方便文件操作。知道怎样设计后,写程序时也遇到很多的障碍,特别是指针的改接和指向和出错处理。此时深感自己编程能力的不足,经过多次修改,终于设计好了该设计。通过该课程设计,使我们更了解了课本知识,巩固了课本知识,同时也使我们的编程能力有了一定的提高,最重要的是我们深切体会到团队的重要,怎么配合和分工才能更快更好的完成任务。72源代码(代码文字已缩小)#include#include #include #include #include #include #include #include #include #include #include #include #include #include #define BOOL int using namespace std; const unsigned FILE_SYS_SIZE = 1024 * 1024; /模拟文件系统的容量设为1M const unsigned BITMAP_LEN = 64; /位示图的长度 512/8 const unsigned BLOCK_SIZE = 512; /一个文件块的大小 const unsigned BLOCK_COUNT = 512; /文件系统中文件块的数量 const unsigned NAME_LEN = 15; /最长文件名的长度 const unsigned PASSWORD_LEN = 15; /用户密码的最大长度 const unsigned LOGIN_COUNT = 3; /用户登录尝试次数 const unsigned COMMAND_LEN = 200; /命令行最大长度 const unsigned PRO_SET_COMM_COU = 11; /预设命令数const unsigned USER_NAME_SIZE=15;/最大用户名长度 const unsigned USER_PASSWORD_SIZE=15;/最大用户密码长度const unsigned MAX_USER_NUMBER=10;/最多用户数目const unsigned MAX_FILE_SIZE=200;/最大文本字符数目 const char *PRO_SET_COMM = creat, format, read, write, logout, del, cdir, cd, dir, exit,help; /文件元素可供操作性权限 typedef enum pub, /任何人可做任何操作(公共文件,所有人都可查看) protect, /非创建者或ADMIN,只可以察看 (保护,只有自己和管理员可查看) pri /非创建者或ADMIN,不可以做任何操作 (系统文件) FileAccess; /文件元素类型 typedef enum file, /文件 dir /文件夹 FileType; /表示 文件状态 typedef enum FileStatus closed, opened, reading, writing ; /一个文件索引结构 (文件节点) struct FileIndexElement unsigned Index; /文件元素索引编号 char FileNameNAME_LEN; /文件元素名 char ParentNameNAME_LEN; /父节点名 unsigned FileBlockId; /文件元素所在物理块编号 unsigned FileLevel; /文件元素所在层次,层文件元素名为一个文件元素的逻辑位置 char creatTime18;/文件创建时间 char *filecontent;/文件内容 BOOL effect; /是否有效,0-无效,1-有效 FileType Type; /识别文件还是目录 ; /文件索引结构或目录表项 (文件目录结构) struct FileIndex FileIndexElement *FIStart; /文件系统中的文件索引起始位置 unsigned FILen; /文件索引的最大长度 unsigned FICount; /文件索引数量 ; /文件块的结构 (存储数据块结构)struct FileBlock;typedef struct FileBlock *pFileBlock;struct FileBlock unsigned FileBlockId; /文件块编号 unsigned BLOCK_SIZE; /文件块的容量 char *FileBlockAddr; /文件块地址 pFileBlock next; /下一个文件块的地址 ; /文件系统的位示图结构 (用于显示分配的存储器分配情况)struct BitMap unsigned BITMAP_LEN; /文件位示图长度 char *BMStart; /位示图的起始指针 ; /文件系统结构 (超级块的结构 ,全局变量)struct SuperBlock char *FSStart; /文件系统的起始地址 unsigned SuperBlockSize; /文件系统的容量 BitMap bm; /文件系统中的位示图 unsigned BLOCK_COUNT; /文件系统中文件块的数量 pFileBlock head; /文件系统中文件块首地址 FileIndex FI; /文件系统中的文件索引 ; /登陆用户的数据结构 (用户的数据结构)struct User;typedef struct User *pUser;struct User char *UserName; /用户名称 char *password; /用户密码 int isAdmin; /用户类型,1表示管理员,0表示用户 pUser NextUser;struct LoginStruct int User_Login_tims;int UserNum;pUser pUserList; /文件系统中的元素结构,包括文件和文件夹 (逻辑文件的定义,树形结构)struct FSElement;typedef struct FSElement *pFSElement;struct FSElement pFSElement parent; /指向自己的父亲节点 unsigned FileLevel; /文件元素所在层次,层文件元素名为一个文件元素的逻辑位置 char FileNameNAME_LEN; /文件元素名 unsigned FileBlockId; /文件元素所在物理块编号 unsigned FileElemLen; /文件元素的长度 FileType Type; /文件元素类型 FileAccess Access; /文件元素可供操作的权限 User Creator; /文件创建者 char CreateTime18; /创建时间,日期格式:MM/DD/YY HH:MI:SS char LastModTime18; /最后一次修改时间 char *FileData; /一个文件的数据开始地址,文件夹时该值为NULL FileStatus fileStu; /如果是一个文件表示文件当前的状态 ; /系统当前状态 struct CurrentStatus User CurrentUser; /当前用户 unsigned FileLevel; /用户所在文件系统层 FSElement *CurrParent; /当前层的父节点 char *CurrentPath; /当前路径 ; SuperBlock FS; /一个全局文件系统的变量 CurrentStatus CS; /当前系统状态 FSElement *base; /文件元素的根 LoginStruct LoginS;/用户列表,在登录的时候用到,以链表形式存储bool InitFileSys(); /(初始化文件函数)/=/函数说明:权利 声明void Right(void) cout文件管理系统 版本1.4n; cout版权所有 (c) 2011 计算机4班。保留所有权利。nn; return; /=/ 函数介绍:寻找第一个 空白 的文件块ID / 返 回 值:返回第一个空白块的ID unsigned FindBlankFileBlockId(void) unsigned char c; /通过位示图 查找 可以简化 for (unsigned i = 0; i next != NULL) if (fblock-FileBlockId = fileblockid) return fblock-FileBlockAddr; /如果找到文件块,返回文件块的地址, else fblock = fblock-next; return NULL; /没有找到,返回空。 /=/ 函数介绍:得到当前时间的字符串 / 输入参数:时间字符串的指针 void GetCurrent_Time(char *currtime) char dbuffer 9; char tbuffer 9; _strdate(dbuffer); /获得日期 _strtime(tbuffer); /获得时间 strcpy(currtime, dbuffer); strcat(currtime, ); strcat(currtime, tbuffer); /将两者拼接在一起,并用空格隔开 /=/ 函数介绍:更新文件索引 / 输入参数:fileblockid 文件块ID void AddFileIndex(unsigned fileblockid, unsigned filelevel, char *filename, char *parentname,FileType temp) FS.FI.FIStartFS.FI.FICount.FileBlockId = fileblockid; FS.FI.FIStartFS.FI.FICount.FileLevel = filelevel; strcpy(FS.FI.FIStartFS.FI.FICount.FileName, filename); FS.FI.FIStartFS.FI.FICount.Type = temp; if (parentname = NULL) memset(FS.FI.FIStartFS.FI.FICount.ParentName, 0, NAME_LEN); /如果没有父亲节点的话,将其父亲节点格式化 else strcpy(FS.FI.FIStartFS.FI.FICount.ParentName, parentname); FS.FI.FIStartFS.FI.FICount.Index = FS.FI.FICount; FS.FI.FIStartFS.FI.FICount.effect = 1; GetCurrent_Time(FS.FI.FIStartFS.FI.FICount.creatTime); FS.FI.FICount +; /=/ 函数介绍:更新位示图 / 输入参数:fileblockid 文件块ID 更改对应的位示图void UpdateBitMap(unsigned fileblockid) /计复所在位示图的位置 int dirInBitmap = (int)(fileblockid / 8); int dirInChar = fileblockid % 8; char *c = &(FS.bm.BMStartdirInBitmap); int xor; switch (dirInChar) case 0: xor=0x80; break; case 1: xor=0x40; break; case 2: xor=0x20; break; case 3: xor=0x10; break; case 4: xor=0x08; break; case 5: xor=0x04; break; case 6: xor=0x02; break; case 7: xor=0x01; break; *c = *cxor; /=/ 函数介绍:创建一个文件元素 / 输入参数:acc 文件元素可操作权限,filename 文件元素名称,type 文件元素类型,filecontent 文件内容, parent 指向其父节点/ 返 回 值:返回一个文件元素的指针 pFSElement CreateFileElement(FileAccess acc, char *filename, FileType type, char *filecontent, FSElement *parent) unsigned blankFileBlockId = FindBlankFileBlockId();/寻找空闲的文件块 char *blank = FindBlankFileBlock(blankFileBlockId); /blank为找的空白文件块的地址 FSElement *fs = (FSElement *)blank; int flag = 0; for(int i=1;i= BLOCK_COUNT) /如果没有空白的文件块存储的话 printf(未找到一个文件块的idn); return NULL; /查找第一个空白块的地址 if (blank = NULL) printf(未找到一个文件块的地址n); return NULL; /更新索引表 fs-Access = acc;/文件操作权限 fs-Creator = CS.CurrentUser; /文件的创建者 GetCurrent_Time(fs-CreateTime); /文件创建时间 fs-FileBlockId = blankFileBlockId; /文件所在的文件快号 fs-FileLevel = CS.FileLevel; /文件所在的逻辑层次 strcpy(fs-FileName, filename); strcpy(fs-LastModTime, fs-CreateTime); /最后修改时间 fs-Type = type; /文件类型 fs-parent = parent; if (type = dir) fs-FileElemLen = sizeof(FSElement); fs-FileData = NULL; else fs-FileElemLen=(unsigned)strlen(filecontent); / fs-FileElemLen = (unsigned)strlen(filename); fs-fileStu = closed; fs-FileData = (char *)fs + sizeof(FSElement); if (filecontent) strcpy(fs-FileData, filecontent); for(i=0;iFileName,type); /

温馨提示

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

评论

0/150

提交评论