1、目 录1、引 言22、需求分析33、概要设计43.1 系统的主要功能4(1)主界面4(2)Create 建立文件5(3)Read 读取文件6(4)Write 写入文件7(5)Delete 删除文件9(6)Mkdir 建立目录10(7)Cd 切换目录11(8)Logout 退出登录123.2 系统模块功能结构12(1) 结构说明:123.3 运行环境要求133.4 数据结构设计133.5数据结构说明14(1)文件结构链表14(2)函数介绍144、详细设计154.1 模块设计154.2 算法流程图155、系统源代码17见附录176、系统测试及调试186.1 运行结果及分析186.2 系统测试结论2
2、27、总结与体会23参 考 文 献24附录 系统的主要源代码2511、 引 言计算机操作系统是计算机系统中不可缺少的基本系统软件,计算机操作系统是由硬件和软件两部分构成的。操作系统实际上是一个计算机系统中硬、软件资源的总指挥部。能有效的组织和管理计算机系统中的硬件和软件资源、合理的组织计算机工作流程,控制程序的执行、并向用户提供各种服务功能,使得用户能够合理、方便、有效的使用计算机,是整个计算机系统能高效运行的一组程序模块的集合。操作系统在计算机体系中张非常重要的地位。在现代计算机管理中,总是把程序和数据以文件的形式存储在磁盘和磁带上,供所有的或指定的用户使用。为此,在操作系统中必须配置文件管
3、理机构。文件管理的主要任务是对任务和系统文件进行管理,以方便用户使用,并保证文件的安全性。为此,文件管理应具有对文件存储空间的管理、目录管理、文件的读写管理,以及文件的共享与保护等功能。从计算机诞生到现在虽然只经历了短短几十年的时间,但无论是在软件还是在硬件方面,计算机都有着飞跃式的发展。随着计算机应用不断增加,计算机上所需要存储的数据和程序也日益增多,早期的文件管理方式已经不能满足现在的需要。计算机操作系统是配置在计算机硬件上的第一层软件,是对硬件的首次扩充。他在计算机系统中占据了特别重要的地位。操作系统的主要功能是进行处理机管理功能,为了进一步了解文件管理功能,我们建立了一个文件模拟系统,
4、要求编写程序,模拟实现文件系统中关于目录及文件的操作。392、需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1 创建目录:mkdir目录名,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录。2 改变目录:cd目录名,工作目录转到指定的目录下。cd.返回根目录下3 创建文件:create文件名,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。4 写入文件:Write 文件名,把需要写入的数据,写入文件之中。5 读取(显示)文件:Read 文件名,把文件的数据,打印在屏幕上。6 删除文件:delete文件名,删
5、除指定的文件。6 获得命令帮助HELP7 退出文件系统LOGOUT要考虑的特殊情况:1)各个命令对全路径和相对路径的支持A.目录不存在时,给出错误信息B.不能用cd进入文件C.相对路径的解析D.路径中的空格剔除2) 删除目录或文件时的问题A. 删除不存在的文件或目录,给出错误提示B. 删除目录时目录不为空;如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除C. 进入到某个目录下,却要删除本目录或者上级目录3、概要设计3.1 系统的主要功能此文件模拟系统主要是模拟有关目录和文件的创建等操作,具体如下:(1) 主界面主界面的设计主要包含整形的main()函数,
6、在函数体中通过调用while循环语句来实现用户只能验证三次用户名和密码限制,以及对其他模块(帮助命令等)的调用。int main()/主函数main()int i=0;bool in=false;char users8,pwd12;cout|-|endl;cout| 模拟Linux文件系统 |endl;cout| 账号:usr1-usr8 密码:usr1-usr8 |endl;cout| 你只有三次机会来试验账号 |endl;cout|_|endl;coutendl;while(i3)/限制用户的用户名和密码的验证次数coutusers;coutpwd;if(chklogin(users,pw
7、d)in=true;break;i+;help();/调用帮助函数,以便用户命令的使用createroot();while(in)if(!run()break;登录模块中包含了8个默认用户名和密码,且用户在登录时只有三次登录机会,登录不成功则自动退出系统。users usrarray8 =usr1,usr1,/用户名:usr1,密码:usr1usr2,usr2,/用户名:usr2,密码:usr2usr3,usr3,/用户名:usr3,密码:usr3usr4,usr4,/用户名:usr4,密码:usr4usr5,usr5,/用户名:usr5,密码:usr5usr6,usr6,/用户名:usr6,
8、密码:usr6usr7,usr7,/用户名:usr7,密码:usr7usr8,usr8,/用户名:usr8,密码:usr8;(2) Create 建立文件文件的建立主要是使用整形函数create()函数来实现的,具体如下:int create() /定义一个创建文件的整形函数create()temp=initfile( ,0);cintemp-filename;/输入文件名cintemp-content;/输入内容if(recent-child=NULL)temp-parent=recent;temp-child=NULL;recent-child=temp;temp-prev=temp-ne
9、xt=NULL;cout文件建立成功!child;while(ttemp-next)ttemp=ttemp-next;if(strcmp(ttemp-filename,temp-filename)=0& /判断子目录是否存在ttemp-isdir=0)printf(对不起,文件已存在!); /输出文件已经存在return 1;ttemp-next=temp;temp-parent=NULL;temp-child=NULL;temp-prev=ttemp;temp-next=NULL;cout文件建立成功!filename;if(recent-child=NULL)/判断文件是否存在cout文件
10、不存在!child-filename,filename)=0)/读取文件coutchild-contentchild;while(temp-next)if(strcmp(temp-next-filename,filename)=0)coutnext-contentendl;return 1;cout文件不存在!filename;if(recent-child=NULL)cout文件不存在!child-filename,filename)=0)recent-child-isopen=1;/设置文件标记为打开cinrecent-child-content;recent-child-isopen=0
11、;/设置文件标记为关闭cout文件写入成功!child;while(temp-next)if(strcmp(temp-next-filename,filename)=0)recent-child-isopen=1;/设置文件标记为打开cintemp-next-content;recent-child-isopen=0;/设置文件标记为关闭cout文件写入成功!endl;return 1;cout文件不存在!filename;temp=new fnode;if(recent-child)temp=recent-child;while(temp-next & (strcmp(temp-filena
12、me,filename)!=0 | temp-isdir!=0)temp=temp-next;if(strcmp(temp-filename,filename)!=0)/判断文件是否存在cout不存在该文件!endl;return 0;elsecout不存在该文件!parent=NULL)temp-prev-next=temp-next;if(temp-next)temp-next-prev=temp-prev;temp-prev=temp-next=NULL;elseif(temp-next)temp-next-parent=temp-parent;temp-parent-child=tem
13、p-next;delete temp;cout文件已删除!temp-filename;if(recent-child=NULL)temp-parent=recent;temp-child=NULL;recent-child=temp;temp-prev=temp-next=NULL;elsettemp=recent-child;while(ttemp-next)ttemp=ttemp-next;if(strcmp(ttemp-filename,temp-filename)=0&ttemp-isdir=1)printf(对不起,目录已存在!);return 1;ttemp-next=temp;t
14、emp-parent=NULL;temp-child=NULL;temp-prev=ttemp;temp-next=NULL;return 1;(7)Cd 切换目录目录的切换主要是使用整形函数cd()函数来实现的,具体如下:int cd()/定义一个目录切换的整形函数cd() char toparaPARA_LENGTH;cintopara;If(strcmp(topara,.)=0)int i;while(recent-prev)recent=recent-prev;if(recent-parent)recent=recent-parent;i=strlen(para);while(para
15、i!=/ & i0) i-;if(i!=0)parai=0;elseparai+1=0;elsefindpara(topara);return 1;(8)Logout 退出登录当用户执行完自己的操作或任务时,输入logout即可退出系统。3.2 系统模块功能结构图2-1 系统结构图(1) 结构说明:A. 系统进入初始化状态,用户登录且只有三次机会。B. 验证是否成功,成功后用户执行操作,系统接收并执行指令。C. 建立目录,不同的用户可以建立不同的目录。D. 建立属于自己目录的子目录,并可以在子目录之间切换。E. 建立目录下面的文件。F. 用户可以执行写入、读取和删除文件G. 用户是否退出?H.
16、 退出则结束。I. 不退出则进入C步骤。3.3 运行环境要求操作系统Windows Xp ,开发工具VC+6.03.4 数据结构设计用户结构:账号与密码结构typedef struct userschar name8;char pwd10;users;本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。users usrarray8 =usr1,usr1,usr2,usr2,usr3,usr3,usr4,usr4,usr5,usr5,usr6,usr6,usr7,usr7,usr8,usr8,;3.5 数据结构说明(1)文件结构链表
17、struct fnodechar filenameFILENAME_LENGTH;int isdir;int isopen;char content255;fnode *parent;fnode *child;fnode *prev;fnode *next;(2)函数介绍fnode *initfile(char filename,int isdir);/初始化文件或目录void createroot();/建立系统根目录int run();系统运行int findpara(char *topara);对参数进行处理bool chklogin(char *users, char *pwd);检查
18、账号与口令void help();命令列表int mkdir();建立目录int create();建立文件int read();读取文件int write();写入文件int del();删除文件int cd();切换目录int dir();文件与目录列表4、详细设计4.1 模块设计此课程设计把文本作为研究对象来模拟操作系统的文件系统工作过程。所以用一个字符串数组来模拟磁盘空间,顾名思义,模拟磁盘提供字符的存储服务。所有用户构成一个数组,每个数组元素是一个结构体,每个结构体包括三部分,用户的用户名、用户密码和文件链表(由于模拟文件系统的文件数量不多,故文件表采用线性链表来存储。线性表每个结点
19、放置一个文件的FCB,其中存储一个文件的信息,文件名、长度、类型、创建时间等);磁盘空间分配表,采用链表结构,每个节点保存模拟磁盘的一个逻辑块的信息,包括块的最大长度,文件占用长度,占用标志。如果占用标志为0,即该空间可分配给文件。初始化磁盘空间分配表链表,首先把整个模拟磁盘作来一块,并置占用位为0。当有进程申请磁盘空间时,从头开始遍历,检查占用位,如果该块为可分配,则检查块大小,若块长度大于或等于申请空间大小,则把块的前一部分(等于申请大小)分配给文件,并置标志位为占用。剩下的大小作来一个新块,作来一个新节点插入到原节点的后边,标志位为可用。这样就实现了模拟磁盘的线性分配。4.2 算法流程图
20、A. 系统进入初始化状态,用户登录且只有三次机会。B. 验证是否成功,成功后用户执行操作,系统接收并执行指令。C. 建立目录,不同的用户可以建立不同的目录。D. 建立属于自己目录的子目录,并可以在子目录之间切换。E. 建立目录下面的文件。F. 用户可以执行写入、读取和删除文件G. 用户是否退出?H. 退出则结束。I. 不退出则进入C步骤。流程图见4-1。模拟二级文件系统主界面用户登录切换目录退出登录建立目录删除文件写入文件读取文件建立文件图4-1 算法流程图5、系统源代码见附录6、系统测试及调试6.1 运行结果及分析图6-1 用户登录图6-1为登录界面,用户有三次登录机会,默认用户名和密码总共
21、有8个。当用户登录成功时,即可进入主界面。图6-2 主界面图6-2为文件模拟系统的主界面,当用户通过用户名和密码的验证,进入此界面。用户可以执行目录和文件等有关的操作。图6-3 创建文件图6-3为创建文件,当用户在主界面执行文件创建命令(create)时,进入此界面。图6-4 写入并读取文件图6-5为文件的写入和文件的读取,用户执行文件写入命令(write)和文件读取命令(read)命令时进入此界面。图6-5 文件的删除图6-5为用户执行删除命令(del)对文件删除时界面,文件删除后不可恢复。图6-6 创建和切换目录图6-6为创建和切换目录,当用户执行创建目录(mkdir)和切换目录(cd)时
22、,进入此界面。图6-7 退出系统当用户完成了自己的操作,可以选择继续操作或者退出系统。执行退出系统命令(Logout)即可退出。6.2 系统测试结论从运行结果截图中可以看到,程序分别执行了它所包含的7个功能,并且每个功能都能正确的执行。若程序执行开始,三次都未输入正确的帐号和密码,程序会退出不再执行。图6-8 登录限制7、总结与体会虽然我们做过很多次课程设计了,但是感觉自己还有好多需要学习的地方,接到题目要求时,设计大体的框架,考虑好所使用的数据结构,然后用高级编程语言分模块的把架子的思路编写出来,调试,运行,再看看是不是符合题目的要求,上网找些资料,看看想想是不是要提高要求,才可以满足实际的
23、需要,最后把收集的劳动成果组合起来,一个小程序终于成型了,虽然每次的过程差不多都一样,但是每次都会有不同的体会。通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深了对文件系统基本概念的理解,以及磁盘文件系统的文件操作。在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以使我们的查错与纠错变的更方便。总的来说通过这次的设计的学习使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计
24、,使我对操作系统和编程产生兴趣,我想我会在这条路上继续前进下去。我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展和提高。参 考 文 献1 汤小丹,梁红兵,哲凤屏,汤子瀛.计算机操作系统.4版.西安:西安电子科技大学出版社,20042 黄干平,陈洛资,等.计算机操作系统.北京:科技出版社,19893 冯耀霖,杜舜国.操作系统.西安:西安电子科技大学出版社,19894 张丽芬.操作系统教程.3版.北京:电子工业出版社,20135 王红.操作系统原理及应用(Linux).1版.北京:清华大学出版社,20136 庞丽萍.计算机操作系统.1版.北京:人民邮电出版社,20
25、107 胡明庆,高巍,钟梅.操作系统教程与实验.北京:清华大学出版社,2007附录 系统的主要源代码#include stdio.h#include iostream.h#include string.h#include iomanip.h#define FILENAME_LENGTH 10 /文件名称长度#define COMMAND_LENGTH 10 /命令行长度#define PARA_LENGTH 30 /参数长度/账号结构typedef struct userschar name8;char pwd10;users;/文件结构struct fnodechar filenameFIL
26、ENAME_LENGTH;int isdir;int isopen;char content255;fnode *parent;fnode *child;fnode *prev;fnode *next;/账号users usrarray8 =usr1,usr1,usr2,usr2,usr3,usr3,usr4,usr4,usr5,usr5,usr6,usr6,usr7,usr7,usr8,usr8,;fnode *initfile(char filename,int isdir);void createroot();int run();int findpara(char *topara);bo
27、ol chklogin(char *users, char *pwd);void help();int mkdir();int create();int read();int write();int del();int cd();int dir();fnode *root,*recent,*temp,*ttemp;char paraPARA_LENGTH,commandCOMMAND_LENGTH,tempparaPARA_LENGTH,recentparaPARA_LENGTH;/创建文件与目录结点fnode* initfile(char filename,int isdir)fnode *
28、node=new fnode;strcpy(node-filename,filename);node-isdir=isdir;node-isopen=0;node-parent=NULL;node-child=NULL;node-prev=NULL;node-next=NULL;return node;/创建文件存储结点void createroot ()recent=root=initfile(/,1);root-parent=NULL;root-child=NULL;root-prev=root-next=NULL;strcpy(para,/);int mkdir()temp=initfi
29、le( ,1);cintemp-filename;if(recent-child=NULL)temp-parent=recent;temp-child=NULL;recent-child=temp;temp-prev=temp-next=NULL;elsettemp=recent-child;while(ttemp-next)ttemp=ttemp-next;if(strcmp(ttemp-filename,temp-filename)=0&ttemp-isdir=1)printf(对不起,目录已存在!);return 1;ttemp-next=temp;temp-parent=NULL;te
30、mp-child=NULL;temp-prev=ttemp;temp-next=NULL;return 1;int create()temp=initfile( ,0);cintemp-filename;cintemp-content;if(recent-child=NULL)temp-parent=recent;temp-child=NULL;recent-child=temp;temp-prev=temp-next=NULL;cout文件建立成功!child;while(ttemp-next)ttemp=ttemp-next;if(strcmp(ttemp-filename,temp-fi
31、lename)=0&ttemp-isdir=0)printf(对不起,文件已存在!);return 1;ttemp-next=temp;temp-parent=NULL;temp-child=NULL;temp-prev=ttemp;temp-next=NULL;cout文件建立成功!endl;return 1;int dir()int i=0,j=0;temp=new fnode;temp=recent;if(temp!=root)cout .child=NULL)coutTotal: directors i files j child;while(temp)if(temp-isdir)co
32、ut filenameendl;i+;elsecout filenamenext;coutTotal: directors ifiles j filename;if(recent-child=NULL)cout文件不存在!child-filename,filename)=0)coutchild-contentchild;while(temp-next)if(strcmp(temp-next-filename,filename)=0)coutnext-contentendl;return 1;cout文件不存在!filename;if(recent-child=NULL)cout文件不存在!ch
33、ild-filename,filename)=0)recent-child-isopen=1;/设置文件标记为打开cinrecent-child-content;recent-child-isopen=0;/设置文件标记为关闭cout文件写入成功!child;while(temp-next)if(strcmp(temp-next-filename,filename)=0)recent-child-isopen=1;/设置文件标记为打开cintemp-next-content;recent-child-isopen=0;/设置文件标记为关闭cout文件写入成功!endl;return 1;cou
34、t文件不存在!topara;if(strcmp(topara,.)=0)int i;while(recent-prev)recent=recent-prev;if(recent-parent)recent=recent-parent;i=strlen(para);while(parai!=/ & i0) i-;if(i!=0)parai=0;elseparai+1=0;elsefindpara(topara);return 1;int findpara(char *topara)int i=0;int sign=1;if(strcmp(topara,/)=0)recent=root;strcp
35、y(para,/);return 1;temp=recent;strcpy(temppara,para);if(topara0=/)recent=root-child;i+;strcpy(para,/);elseif(recent!=NULL & recent!=root)strcat(para,/);if(recent & recent-child)if(recent-isdir)recent=recent-child;elseprintf(路径错误!n);return 1;while(ichild)i+;if(recent-isdir)recent=recent-child;elsepri
36、ntf(路径错误n);return 0;strcat(para,/);while(toparai!=/ & ifilename,recentpara)!=0 | (recent-isdir!=1) & recent-next!=NULL)recent=recent-next;if(strcmp(recent-filename,recentpara)=0)if(recent-isdir=0)strcpy(para,temppara);recent=temp;printf(是文件不是目录。n);return 0;strcat(para,recent-filename);if(strcmp(recent-filename,recentpara)!=0 | recent=N
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922