OS课程设计.采用二级目录实现文件管理1|17操作系统课程设计报告采用二级目录实现文件管理学院:信息工程学院班级:计科1002班姓名:杨辉学号:101304230指导教师:邹姝稚时间:2013年1月成绩:OS课程设计.采用二级目录实现文件管理2|17目录一设计目的···················3二课题任务···················3三课题相关知识·················4四课题设计···················6五设计内容···················8六运行与测试·················14七设计总结··················17一.设计目的:OS课程设计.采用二级目录实现文件管理3|17文件系统是现代OS用来存储和管理信息的机构,具有按名存取的功能,不仅能方便用户对信息的使用,也有效提高了信息的安全性。本课题模拟文件系统的目录结构,并在此基础上实现文件的各种操作方法。通过课程设计,深入理解文件目录的作用和功能,掌握文件打开结构,熟悉与文件有关的系统调用,从而更好的掌握文件系统的概念。(1)掌握文件系统的基本原理、结构和实现方法。(2)掌握文件系统中文件的建立、打开、读/写、执行、属性等系统调用的使用(3)学会设计简单的文件系统并实现一组操作(4)通过实验学习文件系统的系统调用命令,提高文件系统实现功能的理解和掌握。二.课题任务为简单起见,假设文件物理结构为连续结构,编程模拟一个简单的文件系统,实现对文件的各种管理和控制功能。1.文件目录采用二级目录结构,第一级为文件目录MFD,如图1所示;第二级为用户文件目录UFD,如图2所示。用户名用户文件目录地址图1MFD结构文件名文件保护方式文件当前长度文件最大长度文件所在地址图2UFD结构在UFD中,文件保护方式,用0表示文件可读;用1表示文件可读可写,执行,用2表示文件可写。2.为加速文件存取,为每个用户建立一张用户打开文件表UOF,用以记录该用户当前正在使用的文件。假定最多允许打开4个文件,该表设置问4项,当打开文件个数超过4时,应给出出错信息。为此应该设置一个用户打开文件计数器,以控制文件打开个数,计数器初始化为0.UOF结构图如图3所示。文件名文件操作方式读指针写指针文件当前长度文件所在地址状态图3UOF结构在图3中,“文件操作方式”时指文件打开后要执行的操作,“状态”是指用户打开文件表的各个表象为空表目或被占用。读写指针用来指出文件的存取位置。出事状态下,读指针=1,写指针=文件长度,文件长度=0。用户建立或打开一个文件时,将制定文件的说明信息登记在用户打开文件表中,其中为了给创建的文件分配磁盘空间,可引入一个计数器,用它来模拟磁盘使用情况,初始化为10。假定一个磁盘块大小为64个字节。3.为该文件系统提供6条操作命令:创建、打开、读、写、关闭、删除、复制、粘贴等。OS课程设计.采用二级目录实现文件管理4|17要创建文件并向文件中保存信息时,用户程序应用create、write、close等3条命令来实现;当要读文件时,用户文件应使用open、read、close等3条命令来实现。4.在该模拟系统中,应先建立主文件目录、用户文件目录和用户打开文件表,然后接受合法用户,给出一个菜单,按用户选择执行相应操作。三.课题相关知识设计一个简单的二级文件系统设计内容:编写程序模拟实现一个简单的文件管理系统,方便用户使用。设计方法:使用两个结构体,USD、LIST分别存储用户和文件两个层次的数据信息,LIST链表有两个指针child、next,分别存储下一级文件和其他同级文件而实现树型的多级文件存储和管理。结构体如下:typedefstructlistLIST;structlist{charlistname[10];///文件名长度inttype;intlength;/////文件长度intprotect;/////保护模式,0为只读1为可读写intflag;//////标志,为0时创建文件夹,为1时创建文件intmark;///标志文件状态,是否忙碌char*content;structlist*parent;structlist*child;structlist*next;};typedefstructusdUSD;structusd{charusername[10];////用户名长度LIST*list;structusd*next;};除此以外,还用到一下自定义函数,其功能注释如下:OS课程设计.采用二级目录实现文件管理5|17////函数声明/////voiddisplayusermenu();///用户管理界面菜单voidtime();///系统时间voiddisplayfilemenu();///文件管理界面菜单voidcreatuser();///新建用户voiddeleteuser();///删除用户voiddisplayuser();///显示用户voiduserhelp();///用户管理帮助voidfilehelp();///文件管理帮助voidselectuser();///选择用户voiddisplaylist();///显示文件或者文件夹voidcreatfile(LIST*qq,intflag);///创建文件(夹)voiddeletefile(LIST*qq,intflag);///删除文件(夹)voidopenfile();///打开文件voidreadfile();///读取文件voidwritefile();///写入文件voidclosefile();///关闭文件voidnext();///下一层文件夹voidback();//上一层文件夹voidcopyfile();//复制文件voidpastedfile();///粘贴文件voidquit();///直接退出系统voiddispshow(LIST*qq);///显示用户下文件四.课题设计OS课程设计.采用二级目录实现文件管理6|171、系统执行流程图2、创建文件(夹)开始界面开始选择操作创建文件删除文件读文件写文件创建文件夹删除文件夹目录跳转查看所有文件查看帮助查看所有目录返回主菜单结束选择操作新建用户删除用户选择用户列出用户帮助文档推出系统OS课程设计.采用二级目录实现文件管理7|173、删除文件(夹)五.设计内容:主要链表:USD*user=NULL,*currentuser=NULL;LIST*list=NULL,*currentlist=NULL,*copylist=NULL;创建用户模块:voidcreatuser()///创建用户开始创建文件(夹)文件(夹)是否存在结束输入文件(夹)名文件已存在,无法创建开始文件(夹)不存在文件(夹)是否存在结束输入文件(夹)名删除文件(夹)OS课程设计.采用二级目录实现文件管理8|17{inti;chars;USD*p,*q=user;system(cls);p=get(USD);for(i=1;q!=NULL;i++)q=q-next;//i指示当前用户个数q=user;printf(\n创建一个新用户\n);printf(\n请输入第%d个用户名:,i);scanf(%s,p-username);//输入新用户的名字LIST*l=list;l=get(LIST);strcpy(l-listname,p-username);l-next=NULL;l-type=1;l-parent=NULL;l-child=NULL;p-list=l;p-next=NULL;if(user==NULL){user=p;//若user为空,则把P复给user}else//若user不为空,则以有旧用户存在{while(q-next!=NULL){//寻找最后一个用户if(strcmp(p-username,q-username)==0){//比较,看系统是否已经存在该用户printf(\n\ttheuserhasexit!tryagain!\n\n);///提示出错信息getchar();getchar();system(cls);displayusermenu();}q=q-next;}OS课程设计.采用二级目录实现文件管理9|17if(strcmp(p-username,q-username)==0){///检查提示重名并提示信息printf(\n该用户已经存在!无法创建该用户!\n\n);getchar();getchar();system(cls);displayusermenu();}q-next=p;//继续寻找下一个字符}printf(\n是否要再创建一个用户?(Y/N):);//输入下一个用户scanf(%s,&s);switch(s){case'y':creatuser();break;case'Y':creatuser();break;case'n':displayusermenu();break;case'N':displayusermenu();break;default:displayusermenu();break;}}删除用户模块:voiddeleteuser()//删除用户{charn[10];USD*p=user,*pre=NULL;displayuser();if(!p){printf(\n系统无用户可删除!\n);//P为空,报错,必须先创建一个用户getchar();getchar();system(cls);displayusermenu();}printf(\n\n请输入要删除的用户名:);scanf(%s,n);while(p!=NULL){if(strcmp(p-username,n)==0)//寻找所要删除的用户{if(p==user){OS课程设计.采用二级目录实现文件管理10|17user=user-next;//若是第一个用户,则释放P}else{pre-next=p-next;}free(p);printf(\n\n\n^^已经成功删除用户[%s]!!!^^,n);break;}else{pre=p;p=p-next;}}if(p==NULL)//找不到用户{printf(\n\n找不到该用户!请确认该用户是否存在!\n);}getchar();getchar();system(cls);displayusermenu();}文件(夹)创建模块:voidcreatfile(LIST*qq,intflag)//创建文件(夹){LIST*temp;LIST*p=qq-child;LIST*q;temp=get(LIST);loop:q=qq-child;if(flag==0){printf(\n创建一个新文件\n);printf(\n请输入新建文件名:);//输入文件名OS课程设计.采用二级目录实现文件管理11|17}else{printf(\n创建一个新文件夹\n);printf(\n请输入新建文件夹名:);//输入文件名}scanf(%s,temp-listname);while(q!=NULL){if(strcmp(temp-listname,q-listname)==0){printf(\n相同路径下有重名文件!请重新输入!);gotoloop;}q=q-next;}temp-content=NULL;printf(\n文件属性:0]、只读Read\t\t1]、读和写Read&Write\t\t2]只写Write);//设置保护模式printf(\n\n请根据提示选择保护模式(0/1/2)?:);scanf(%d,&temp-protect);while(temp-protect!=0&&temp-protect!=1&&temp-protect!=2){printf(\n\n你的选择有误!请重新输入(0/1)?:);scanf(%d,&temp-