计算机操作系统课程设计班级:计091—1姓名:学号:使用语言:C++指导老师:学院:系统要求1、实验目得通过一个简单多用户文件系统得设计,加深理解文件系统得内部功能及内部实现2、实验内容为1inux系统设计一个简单得二级文件系统要求做到以下几点:(1)可以实现下列几条命令(至少4条);1ogin?用?户登陆dir??列文件目录create创建文件de1ete删除文件open??打开文件close?关闭文件read??读文件write写文件(2)列目录时要列出文件名、物理地址、保护码与文件长度;(3)源文件可以进行读写保护.1、系统分析1、设计思想本文件为二级文件系统,即要实现对文件得增删改查,同时又具备登陆系统、注册用户得功能,各个用户之间得文件系统互不干扰本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下得文件•另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容系统采用结构体来存储用户、文件目录、文件数据内容:048*548*5+44*5048*5+44*50+264*200每个分区都就是由结构体组成区每个个去得结构体得个数由格式化系统就是决定•整个系统得编码构成主要分为:@Workspace'file1*1projed(f-Ifilefiles-SourceFiles器mymain,cpp团mysyG.cppmyuseriile.cpp-€3HeaderFiles图allstruct.li司mysys^h哥myuserfile.hrIResourceFilesAllstruct、h定义了每个分区得结构体;Mysys、h声明了对系统操作得各种方法;Myuserfile、h声明了对文件操作得各种方法;Mymain>cpp整个系统得主函数,操作入口;Mysys、cpp包含了mysys、h,实现了操作系统得各种方法;Myuser包含了myuscrfi1e、h,实现了操作文件得各种方法;2、主要数据结构A1lstruct、h文件得内容:structs_user?//用户区结构体{-?1ongisuse〃就是否使用charname[20];//用户名charpsd[20];?ongaddress;};structs_1ist?{-longisuse;charname[20];long?1ongmyaddress;pointaddress;isfi1e;ongpointsize;long1?ongnextaddress;};structs_file{-?ongisuse;?sharcontent[256];?ongnext;};〃密码//目录地址//目录结构体//就是否使用//文件名字〃本条目录地址//指向得文件得地址//就是否锁定//目标文件得大小//下条目录得地址〃文件结构体//就是否使用〃文件内容〃下个文件块地址系统执行,并1、如果首次进入系统,还没有文件系统,则会提示格式化文件系统,创建分区初始化分区:2、刚初始化后,没有用户,提示创建用户:U3、用户创建成功后出现对系统操作得菜单4、注册用户功能:请输入新用户的用户名!Arinin惰输入密码123情再次输入密码;M23展入存储*“*制建用户威功。
5、用户登录,登录成功后显示当前用户下得所有文件及其详细信息,同时显示对文件操作得菜单:请输入用户名=请输入密码’L23登陆成功!欢迎您典目录为空I容态程-内状出择4ULUL定退选文文文文锁.的盲建除改否销您查新删修是注kw■■■■■■1234-506新注册得用户默认为没有文件,选择创建文件,并且每次对文件操作后显示当前用户得所有文件与操作菜单:请输入文件名£字母和数字"最多仞个字符九aa文件由多少个字符沖组成?(必须小于冇冏个字符〉128文件是否锁定了y锁定/2或其他》自由谏写当前目录下的文件;刘牟名XJOEXKXJCKEJC大小是否锁定物理地址aa129V24407、此次新建得文件为锁定状态,不能被删除:8、对文件查瞧,默认创建得时候用0填充文件内容:縮入要查看的文件的名韦(仅限当前目議》aa00000090000000000000000000000000000000000000000000000000000000000000«MHO0009U0SO0000U0SO0000000000000000000000B00006t)反件查看成功!当前目录下的文件;爻件名大小是否锁定物理她址aa128V2440liiEHUitMEHiaMEiiEHUitMEHMiMEiiEHUitMEHMiiMXXiMaiiEiOiMiiMXXlrfaiiEiOiMiiMXXlrfaiiEiOiMiiMXXlrfaiiEiOiMiiMXXlrfiiiEiOiMiiMXXlrfiiiE斗9、修改文件内容:摩詡BBE势觀巒厨輻曾营舸整酬亘廊期U入内容;dfsafsrsdfs#include"myuserfile、classMSysterm{?//成员变量private:FILE衣myfile;?MUsermyuser;//成员函数public://打印登陆后得用户名//检查虚拟文件系统跟就是否存在//初始化虚拟磁盘//用户登录//主控制程序//用户注销MSysterm(){}voidoutName()intcheack();intmyformat();?intcreateuser();//创建用户intlogin();voidmymain();intlogout();};Myuserfile、h#includeclassMUser{//成员变量public:?FILE*myfile;??harname[20];?charpsd[20];longlistaddress;?longmyaddress;private:longlastaddress;//成员函数public://封装了管理文件得方法//用户名//密码//目录地址//此用户得地址//最后一个目录得地址intcreateFile();//增加文件intdel[20]);//删除文件?intrevamp[20]);//修改文件intmydir();//列出当前目录得所有文件(夹)?intview[20]);//查瞧文件?intmyConversion(char[20]);//转换就是否锁定状态private:?intisSame(char[20],char[20]);};Mymain、cpp#includevstdio、h>#include#include"mysys、h”#includeusingnamespacestd;intmain(){char?intn_selec?MSysterm?/*?i?{nod1;t=2,i_1=0;mysys;**********文件不存在得程序入口************/f(mysys、cheack()==—1)//磁盘空间不存在?cout〈v”虚拟磁盘文件不存在,就是否生成??cin>>nod1;?cin、clear();//清除流得错误标记?cin、ignore(numeric_limits::??if(nod1==/Y'||nod1==/y'){?cout<〈"正在创建.。
<>nod1;??return2;??}Eoutv〈”创建完成!就是否创建用户?Y/N?cin>>nod1;??c?in、clear();//清除流得错误标记??in、ignore(numeric_limits〈streamsize>::?if(nod1==Y'||nod1=='y'{??if(mysys、createuser()==1)//创建用户??{?cout〈〈”创建用户成功"vvendl;?}??else??{??outvv”创建用户失败!即将退出"<::max(),'==1)-for(inti_1=0;i_1<=3;i_1++)if(mysys、login()==1){?cout<<"登陆成功!欢迎您”?mysys、outName();break;??e1se%outVV"用户名不存在或密码错误!"(i_1==4)cin>〉cout<<"非法用户!”〈〈endl<<”nod1;??return5;??}?????}??if(n_se1ect==?{??if(mysys、c{??cout<<"break;//登录<〈end1;输入任意键退出reateuser()==1)〃创建用户创建用户成功。
〈Vendl;??}????e1se??{?cout<〈”创建用户失败!"〈isuse=0;s_;ms_;for(i=1;i〈=5;i++){?if(fwrite(&ms_user,sizeof(ms_user),1,my)//用户区格式化?{?cout〈〈”用户格式信息写入失败!"〈vendl;?fc1ose(myfile);??r?eturn-2;}}?or(i=1;i〈=50;i++)?{if(fwrite(&ms_list,sizeof(ms」ist),1,my)//目录区格式化?{???out<<”目录格式信息写入失败!”〈
<〈endl;//检查用户空间就是否足<〈endl;my("testl、txt,”"r”);for(i=1;i<=5;i++,fseek(my),nowaddress++){if(fread(&ms—user2、isuse,4,1,my){応outv<"读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"?fclose(myfile);??return—l;}?f(ms_user2、isuse==0){??reak;?}?if}(i==6){?cout<<”用户空间已满!创建用户失败”<〈endl;return-2;?}?for?{;;)cicicout<<"请输入新用户得用户名:”«endl;cin>>ms_user、name;n、clear();//清除流得错误标记n、ignore(numeric_1imits〈streamsize>::max(),'\n');//清空输入?fseek(my);for(i=1;i<=5;i++)//检查用户名??字{if(fread(&ms_user2、isuse,4,1,my)〃找到被使用得用户区,下一步读取名?????fclo?{cout〈<”读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<=6){for(;;)//输入密码cout<<”请输入密码,最多n>>ms_user、psd;?cin、clear();//gnore(numeric.cin、i请重新输入:"〈〈endl;19位。
"〈〈endl;清除流得错误标记limits::max(),'\n');//清空输〈〈"请再次输入密码:"<〈endl;in>>ms_user2、psd;clear();//清除流得错误标记cout?c??2in、cin、ignore(numeric—limitsvstreamsize>::max(),'\n');//清for(m=0;mv=19;m++)??{????if????{(ms_user、psd[m]!=ms_user2、psd[m])??psd<"?????????????????P???is?same=0;?cout<<”两次密码不匹配"vvm>ms_user、name;cin、c1ear();//清除流得错误标记cin、ignore(numeric_limits〈streamsize>::max(),'\nz);//清空输入流?my(”etst1、txt","r”);for(i=1;iv=5;i++)?f(fread(&ms_user2、isuse,4,1,my)//读取被使用得用户区?{??c?out〈v"读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<〈endl;fc1ose(myfi1e);??return-1;?}?f(ms_user2、isuse==0)??{?fseek(my);??c?ontinue;}else??{???(fread(&ms_user2、name,20,1,my)//读取名字?{??cout<〈”读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<〈end1;??f?close(myfile);????r?eturn—1;??}??for(m=0;m<=19;m++)??{???if((ms_user、name[m]!=ms_user2、name[m])????{???issame=0;???break;??}??e1se?{??i?ssame=1;??f(ms—user、name??{?break;??}m]=='\0')???}}if(issame==1){if(fread(&ms_user2、d,20,1,my)//读取密码???{??????u"读取密码失败!磁盘错误."?fc1ose(myfi1e);return—1;end1;?}??f?or??{?(intk=0;kv=2;k++)清空输入流???fo???{?????if(ms_user、??zout〈<"请输入密码:"v?cin〉>ms_user、psd;cin、c1ear();//清除流得错误标记cin、ignoendl;re(numeric_limitsvstreamsize>::max(),/n");//m=0;m<=19;m++)psd[m]!=ms_user2、psd[m]){issamebreak;=0;????else???{???i?s?same1;if(ms_user、?{psd[m]=='0')break;????}???i?f?????????}}same==0){cout<<"密码错误,请重新输入•”<〈endl;else{?i?{?cout<<"读取目录失败!磁盘错误。
"<〈end1;??fc1ose(myfi1e);?return-1;f(fread(&ms_user2、address,4,1,my)〃读取目录地址for(m=0;m〈=19;m++)//对对象myuser赋值??{??????myuser、psd}myuser、?myuser、????}??fc??r?etur??fsee}fct?re}void{?Dha?for{?myuser、name[m]=ms_user2、name[m];[m]=ms_user2、psd[m];listaddress=ms_user2、address;myaddress=(i—1)*48;??fclose(myfile);return1;//返回登录成功}ose(myfile);n—2;//密码错误}???}k(my);lose(myfi1e);urn-1;MSysterm::mymain()//主控制程序intm_point=9,r(;myget=0;//记录使用第几层控制台,接收函数返回值m_name1[20],m_name2[20];)if(m_pointo)??{??myget=logout();??break;??}?cout<〈end1〈〈”*****************************************************〈endl;?cout〈〈”当前目录下得文件:”?myget=myuser、mydir();?cout<<”*********************************************************************刊**II<<******endl;??cout〈〈”***cout〈?cout〈〈”?cout<<"?cout〈〈"?cout<<”??cout<<"次**次次***次*次*****次*〈en****II***dl;<>m_point;??cin、c1ear();//清除流得错误标记cin、ignore(numeric_1imits〈streatch(m_point);"<>m_name1;??cin、clear();//清除流得错误标记(),'\n');//清?cin、ignore(numeric_limitsm_name1;?cin、clear();//清除流得错误标记cin、ignore(numeric_limits::max()nz);//清空输??????ca?{myget=myuser、del);switch(myget)?{1:????????cout<〈”文件删除成功!"<〈endl;?break;}?case-1:?{???????coutv〈”磁盘打开失败!"listaddress==0)?{?????ut〈〈"您还没有创建文件!”〈〈endl;??break;???}???流????Cout<〈”请输入要修改得文件得名字:(仅限当前目录)”<>m_name1;;//清除流得错误标记(numeric_limits?cin、clear()?cin、ignore>m_name1;n、clear();//清除流得错误标记cin、ignore(numeric_limits::max(),'\n');//清:(仅限当前目录)”〈〈endl;空输入流??myget=myuser、myConversion(m_name1);??switch(myget)??{???case0:???{?????}????c?ase1:??{??cout#include〈stdio、h〉#includeviomanip〉inc1ude〈limits>//用于清除残留得输入流#include"myuserfi1e、h"#include”allstruc、th”usingnamespacestd;intMUser::createFile()//增加文件{?s_listms_list;s_;1ongnowaddress=0,f_address[10],num._char=0;//目录循环记录变量,数据块地址变量组,字符个数(文件大小)?intf_ad_num=0,myerr=0,i=1;//写入得块数,就是否在最终写入时失败(失败置1)?sharf—name[20]={''},m='0',e0”,f_islock;longold_lastaddress=lastaddress;//上一个目录地址(用于出错回滚)?my("testl、fxt","r+”);?f(myNULL){?coutv<”读取磁盘失败!"<〉f_name;cin、clear();//清除流得错误标记cin、ignore(numeric」imits::max(),zn');//清空输入流?fseek(my*5,0);//文件指针跳到目录区?or(i=1;iv=50;i++)〃检查文件名就是否被使用?{if(fread(&ms_1ist,sizeof(ms_list),1,my)〃读取目录?{__??coutv〈"读取目录空间失败,虚拟磁盘格式错误,可能已被损坏"<〈endl;?close(myfi1e);??return-1;??}if(ms_list、isuse==1)//如果读取到未使用则跳出检测?{?if(isSame(f_name,ms_list、name)==1)?{???fclose(myfile);??return—4;?}?}?}for(;;)?{?sout<<"文件由多少个字符m组成?(必须小于2550个字符)"〈>num_char;cin、clear();//清除流得错误标记cin、ignore(numeric_limits::max(),'n');//清空输入流if(num_char〈=2550)?{??break;}?cout<<”文件长度必须小于2550个字符。
"pointsize=num_char;coutv〈"文件就是否锁定?y锁定/n(或其她)自由读写"〈vendl;//确定就是否锁定?sin〉>f」slock;cin、c1ear();//清除流得错误标记cin、ignore(numeric_limits〈streamsize〉::max(),'\n');//清空输入流if(f_islock=='y'||f_islock==Yz){?ms_list、isfile=0;?}?else?{ms_list、is;}?fseek(my*5+44*50,0);//文件指针跳到数据区for(i=0;i〈=199&&f_ad—num〈=(num_char/255);i++,fseek(my))//检查数据空间就是否足够?{?if(fread(&ms_)==0)"<〈end1;{??cout<〈"读取数据空间失败,虚拟磁盘格式错误,可能已被损坏fclose(myfi1e);?return—1;}?if(ms_)〃如果有空白区块i*264+48*5+44*50;//记录下当前空白区??{??_address[f_ad_num]块得绝对物理地址?f_ad_num++;//先用后加??}}?f(f—ad_num<=(num_char/255))//空白得地址不足?{cout〈〈"没有足够得磁盘空间,创建失败!"nextaddress=0;//由于?if(lastaddress==0)//被写入得目录就是首目录{?fseek(my);?if(fwrite(&ms_list,sizeof(ms_list),1,myfile)==0)//写入目录信息?{Eout〈〈"目录写入失败!”〈〈endl;?myerr=2;fclose(myfile);return—3;??}0)//将目录地址?fseek(my);?f(fwrite(&ms_1ist、myaddress,4,1,myfile)写入用户区得目录指针中{??5but
反正数据结构一样-{?cout<<”6<"s;for(x=0;x<100;x++){?if(s[x]==0)?{?break;}??ifretur}(ms_list、pointsizevx)n—5;if(fwrite(&s,100,1,myfile)??{?fclor}fclose(myfile);se(myfi1e);eturn—4;???reak;?}?}?f(isfind==0)II找不到指定得文件?{?fclose(myfi1e)beturn-2;?}return1;}intMUser::mydir()〃列出当前目录得所有文件(夹){?inti=0;s_listms」ist;if(listaddr。