计算机操作系统课程设计_第1页
计算机操作系统课程设计_第2页
计算机操作系统课程设计_第3页
计算机操作系统课程设计_第4页
计算机操作系统课程设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

计算机操作系统课程设计班级:计091-1姓名:学号:使用语言:C++指导老师:学院:一、系统要求1、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。2、实验内容为linux系统设计一个简单的二级文件系统。要求做到以下几点:(1)可以实现下列几条命令(至少4条);login用户登陆dir列文件目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。二、系统分析1、设计思想本文件为二级文件系统,即要实现对文件的增删改查,同时又具备登陆系统、注册用户的功能,各个用户之间的文件系统互不干扰。本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。系统采用结构体来存储用户、文件目录、文件数据内容:048*548*5+44*5048*5+44*50+264*200用户区文件目录区文件数据区每个分区都是由结构体组成,每个个去的结构体的个数由格式化系统是决定。整个系统的编码构成主要分为:

^Workspace'file':1project^-0filefiles-_JSourceFiles声mymain.cpp画mysys.cpp由myuserfile.cpp-_JHeaderFiles国allstruct.h司mysys.h司myuserfile.h_|ResourceFilesAllstruct.hMysys.hMyuserfile.hMymain.cppMysys.cppMyuserfile.cpp定义了每个分区的结构体;声明了对系统操作的各种方法;声明了对文件操作的各种方法;整个系统的主函数,操作入口;包含了mysys.h,实现了操作系统的各种方法;包含了myuserfile.h,实现了操作文件的各种方法;2、主要数据结构//用户区结构体〃是否使用//用户名〃密码//目录地址//目录结构体Allstruct.hMysys.hMyuserfile.hMymain.cppMysys.cppMyuserfile.cpp//用户区结构体〃是否使用//用户名〃密码//目录地址//目录结构体//是否使用//文件名字〃本条目录地址〃指向的文件的地址〃是否锁定//目标文件的大小〃下条目录的地址//文件结构体//是否使用//文件内容//下个文件块地址longisuse;charname[20];charpsd[20];longaddress;};structs_list(longisuse;charname[20];longmyaddress;longpointaddress;longisfile;longpointsize;longnextaddress;};structs_file(longisuse;charcontent[256];longnext;};

三、系统执行创建分区,1、如果首次进入系统,还没有文件系统,则会提示格式化文件系统,并初始化分区:创建分区,陶拟磁盘文件不存在,是否生成?以[TE在创建。。。。I•Ir_L-■L:■~■—■—K_i-1-iJ2、刚初始化后,没有用户,提示创建用户:虚拟磁盘文件不存在,是否生成7必y正在创建0000创建完成I是否创建用户7V/N蓄输入新用户的用户名:yu请输入密码123请再次输入密码:123进入存储0000创建用户成功。3、用户创建成功后出现对系统操作的菜单4、注册用户功能:同时显示5、用户登录,登录成功后显示当前用户下的所有文件及其详细信息,对文件操作的菜单:同时显示6、新注册的用户默认为没有文件,选择创建文件,并且每次对文件操作后显示当前用户的所有文件和操作菜单:7、此次新建的文件为锁定状态,不能被删除:8、对文件查看,默认创建的时候用0填充文件内容:9、修改文件内容:10、对文件的锁定进行装换:11、删除文件:12、注销登录退出系统:府输入您的选牛

L查看文f二2-新建文f二删除文件修改文件是否锁定状态转换队注销,退出程序内容己注销!'fessmnykeytocontinue四、功能实现Mysys.h#include<stdio.h>#include"myuserfile.hclassMSysterm{〃成员变量private:FILE*myfile;MUsermyuser;〃成员函数public:MSysterm(){}voidoutName();intcheack();intmyformat();intcreateuser();intlogin();voidmymain();intlogout();};//封装了管理系统的方法//打印登陆后的用户名//检查虚拟文件系统跟是否存在//初始化虚拟磁盘〃创建用户〃用户登录〃主控制程序〃用户注销Myuserfile.h#include<stdio.h>classMUser//封装了管理文件的方法{//成员变量public:FILE*myfile;charname[20];//用户名charpsd[20];//密码//目录地址//此用户的地址long//目录地址//此用户的地址longmyaddress;private:longlastaddress;//最后一个目录的地址〃成员函数public:intcreateFile();//增加文件intdelFile(charfilename[20]);//删除文件intrevampFile(charfilename[20]);//修改文件intmydir();//列出当前目录的所有文件(夹)intviewFile(charfilename[20]);//查看文件intmyConversion(charfilename[20]);//转换是否锁定状态private:intisSame(charfilename_f[20],charfilename_s[20]);};Mymain.cpp#include<stdio.h>#include<iostream>#include"mysys.h”#include<limits>usingnamespacestd;intmain(){charnod1;intn_select=2,i_1=0;MSystermmysys;/***********文件不存在的程序入口************/if(mysys.cheack()==-1)//磁盘空间不存在{cout<<"虚拟磁盘文件不存在,是否生成?Y/N"<<endl;cin>>nod1;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流if(nod1==,Y,||nod1==,y,){cout<<"正在创建。。。。"<<endl;if(mysys.myformat()!=1)//创建磁盘空间{cout<<"创建磁盘空间失败!即将退出。"<<endl;cin>>nod1;return2;}cout<<〃创建完成!是否创建用户?Y/N〃<<endl;cin>>nod1;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),,\n,);//清空输入流if(nod1==,Y,||nod1==,y,){if(mysys.createuser()==1)//创建用户cout<<"创建用户成功。"<<endl;}else{cout<<"创建用户失败!即将退出。"<<endl;return3;}}else{cout<<"匿名用户无法进入系统,正在退出。。。"<<endl;return4;}}else{cout<<"程序已结束!按任意键退出。。。。"<<endl;return1;}}/***********文件存在的程序入口**************/for(;;){〃〃cout<<"*********************"<<endl;cout<<"请选择:"<<endl;cout<<"1.登录"<<endl<<"2.注册"<<endl<<"3.退出"<<endl;cout<<"*********************"<<endl;cin>>n_select;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流if(n_select==1){for(inti_1=0;i_1<=3;i_1++)//登录{if(mysys.login()==1){cout<<"登陆成功!欢迎您";mysys.outName();break;}else{cout<<"用户名不存在或密码错误!"<<endl;}}if(i_1==4){cout<<"非法用户!"<<endl<<"输入任意键退出。"<<endl;cin>>nod1;return5;}break;}if(n_select==2){if(mysys.createuser()==1)//创建用户{cout<<"创建用户成功。"<<endl;}else{cout<<"创建用户失败!"<<endl;}}if(n_select==3){return6;}}mysys.mymain();return0;}Mysys.cpp#include"mysys.h"#include"allstruct.h”#include<iostream>#include<stdio.h>#include<limits>//用于清除残留的输入流usingnamespacestd;intMSysterm::cheack()//检查虚拟空间是否存在{myfile=fopen("test1.txt”,"r”);if(myfile==NULL){return-1;//返回-1,代表文件不存在}fclose(myfile);return1;}intMSysterm::myformat(){inti=1;myfile=fopen("test1.txt”,"w”);if(myfile==NULL){return-1;}s_userms_user;ms_user.isuse=0;s_listms_list;ms_list.isuse=0;s_filems_file;ms_file.isuse=0;for(i=1;i<=5;i++){if(fwrite(&ms_user,sizeof(ms_user),1,myfile)!=1)//用户区格式化{cout<<"用户格式信息写入失败!"<<endl;fclose(myfile);return-2;}}for(i=1;i<=50;i++){if(fwrite(&ms_list,sizeof(ms_list),1,myfile)!=1)//目录区格式化{cout<<"目录格式信息写入失败!"<<endl;fclose(myfile);return-3;}}for(i=0;i<=199;i++){if(fwrite(&ms_file,sizeof(ms_file),1,myfile)!=1)//数据区格式化{cout<<"数据格式信息写入失败!"<<endl;fclose(myfile);return-4;}}fclose(myfile);return1;}intMSysterm::createuser()//创建用户{s_userms_user,ms_user2;intnowaddress=0,issame=0,m=0,i=1;/记录当前的扫描指针,密码比对标志位,循环使用的变量cout<<"正在检查用户空间是否足够。。。。"<<endl;myfile=fopen("test1.txt”,"r”);for(i=1;i<=5;i++,fseek(myfile,44,1),nowaddress++)//检查用户空间是否足够{if(fread(&ms_user2.isuse,4,1,myfile)==0){cout<<"读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;if(ms_user2.isuse==0){break;}}if(i==6){cout<<"用户空间已满!创建用户失败"<<endl;return-2;}for(;;){cout<<"请输入新用户的用户名:"<<endl;cin>>ms_;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流fseek(myfile,0,0);for(i=1;i<=5;i++)//检查用户名{if(fread(&ms_user2.isuse,4,1,myfile)==0)//找到被使用的用户区,下一步读取名字{cout<<"读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}if(ms_user2.isuse==0){fseek(myfile,44,1);}else{if(fread(&ms_,20,1,myfile)==0)//读取用户区的名字{cout<<"读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}for(m=0;m<=19;m++){if(ms_[m]!=ms_[m]){issame=0;break;}else{issame=1;if(ms_[m]=='\0'){break;}}}if(issame==1)cout<<"用户名重复!请重新输入:"<<endl;break;}fseek(myfile,24,1);}}if(i>=6){for(;;)//输入密码{cout<<"请输入密码,最多19位。"<<endl;cin>>ms_user.psd;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流cout<<"请再次输入密码:"<<endl;cin>>ms_user2.psd;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流for(m=0;m<=19;m++){if(ms_user.psd[m]!=ms_user2.psd[m]){issame=0;cout<<"两次密码不匹配"<<''<<ms_user.psd<<”"<<ms_user2.psd<<""<<m<<endl;break;}else{issame=1;if(ms_user.psd[m]=='\0'){break;}}}if(issame==1){break;}}cout<<"进入存储。。。。"<<endl;ms_user.isuse=1;//空间使用置为使用(1);ms_user.address=0;//默认不存在目录fclose(myfile);myfile=fopen("test1.txt”,"r+");fseek(myfile,48*nowaddress,0);if(fwrite(&ms_user,sizeof(ms_user),1,myfile)==0){cout<<"写入用户信息失败!"<<endl;}else{break;}}}fclose(myfile);return1;}intMSysterm::login()//用户登录{s_userms_user,ms_user2;intissame=0,m=0,i=0;//比较标记,循环使用的变量cout<<"请输入用户名:"<<endl;cin>>ms_;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流myfile=fopen("test1.txt”,"r”);for(i=1;i<=5;i++){if(fread(&ms_user2.isuse,4,1,myfile)==0)//读取被使用的用户区{cout<<"读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}if(ms_user2.isuse==0){fseek(myfile,44,1);continue;}else{if(fread(&ms_,20,1,myfile)==0)//读取名字{cout<<"读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}for(m=0;m<=19;m++){if(ms_[m]!=ms_[m]){issame=0;break;}else{issame=1;if(ms_[m]=='\0'){break;}}}if(issame==1){if(fread(&ms_user2.psd,20,1,myfile)==0)//读取密码{cout<<"读取密码失败!磁盘错误。"<<endl;fclose(myfile);return-1;}for(intk=0;k<=2;k++){cout<<"请输入密码:"<<endl;cin>>ms_user.psd;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流for(m=0;m<=19;m++){if(ms_user.psd[m]!=ms_user2.psd[m]){issame=0;break;}else{issame=1;if(ms_user.psd[m]=='\0'){break;}}}if(issame==0){cout<<"密码错误,请重新输入。"<<endl;}else{if(fread(&ms_user2.address,4,1,myfile)==0)//读取目录地址{cout<<"读取目录失败!磁盘错误。"<<endl;fclose(myfile);return-1;}for(m=0;m<=19;m++)//对对象myuser赋值{[m]=ms_[m];myuser.psd[m]=ms_user2.psd[m];}myuser.listaddress=ms_user2.address;myuser.myaddress=(i-1)*48;fclose(myfile);return1;//返回登录成功}}fclose(myfile);return-2;//密码错误}}fseek(myfile,24,1);}fclose(myfile);return-1;voidMSysterm::mymain()//主控制程序{intm_point=9,myget=0;//记录使用第几层控制台,接收函数返回值charm_name1[20],m_name2[20];for(;;){if(m_point==0){myget=logout();break;}i//csI//couLwendlw******************************************************************************"<<endl;cout<<"当前目录下的文件:"<<endl;myget=myuser.mydir();/-»di4-//coutw个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个**********"<<endl;cout<<"*******************************"<<endl;cout<<"请输入您的选择:"<<endl;cout<<"1.查看文件内容"<<endl;cout<<"2.新建文件"<<endl;cout<<"3.删除文件"<<endl;cout<<"4.修改文件"<<endl;cout<<"5.是否锁定状态转换"<<endl;cout<<"0.注销,退出程序"<<endl;cout<<"*******************************"<<endl;cin>>m_point;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流switch(m_point){case1:{if(myuser.listaddress==0){cout<<"您还没有创建文件!"<<endl;break;}cout<<"请输入要查看的文件的名字:(仅限当前目录)"<<endl;cin>>m_name1;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流myget=myuser.viewFile(m_name1);switch(myget){case1:{cout<<"文件查看成功!"<<endl;break;}case-1:{cout<<"磁盘打开失败!"<<endl;break;}case-2:{cout<<"文件不存在!"<<endl;break;}default:{break;}}break;}//case1文件打开case2:{myget=myuser.createFile();switch(myget){case1:{cout<<"创建成功!"<<endl;break;}case-1:{cout<<"磁盘打开失败!"<<endl;break;}case-2:{cout<<"目录空间已满!"<<endl;break;}case-3:{cout<<"数据空间已满!"<<endl;break;}case-4:{cout<<"文件名已存在!"<<endl;break;}default:{//cout<<"创建文件失败,原因未知!"<<endl;break;}}break;}//case2新建文件case3:{if(myuser.listaddress==0){cout<<"您还没有创建文件!"<<endl;break;}cout<<"请输入要删除的文件的名字:(仅限当前目录)"<<endl;cin>>m_name1;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流myget=myuser.delFile(m_name1);switch(myget){case1:{cout<<"文件删除成功!"<<endl;break;}case-1:{cout<<"磁盘打开失败!"<<endl;break;}case-2:{cout<<"文件不存在!"<<endl;break;}case-4:{cout<<"文件锁定!不能删除!"<<endl;break;}default:{cout<<"未知原因,删除失败!"<<endl;break;}}break;}//case3删除文件case4:{if(myuser.listaddress==0){cout<<"您还没有创建文件!"<<endl;break;}cout<<"请输入要修改的文件的名字:(仅限当前目录)"<<endl;cin>>m_name1;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流myget=myuser.revampFile(m_name1);switch(myget){case1:{cout<<"文件修改成功!"<<endl;break;}case-1:{cout<<"磁盘打开失败!"<<endl;break;}case-2:{cout<<"文件不存在!"<<endl;break;}case-4:{//cout<<"文件锁定!无法修改!"<<endl;break;}case-5:{cout<<"输入内容过多!无法修改!"<<endl;break;}default:{//cout<<"未知原因,修改失败!"<<endl;break;}}break;}//case4修改文件case5:{if(myuser.listaddress==0){cout<<"您还没有创建文件!"<<endl;break;}cout<<"请输入要转换是否锁定的文件的名字:(仅限当前目录)"<<endl;cin>>m_name1;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流myget=myuser.myConversion(m_name1);switch(myget){case0:{cout<<"文件已转换为锁定!"<<endl;break;}case1:{cout<<"文件已转换为自由读写!"<<endl;break;}case-1:{cout<<"磁盘打开失败!"<<endl;break;}case-2:{cout<<"文件不存在!"<<endl;break;}default:{cout<<"未知原因,修改失败!"<<endl;break;}}break;}//case5转换是否锁定状态default:{break;}}//switch}}intMSysterm::logout()//用户注销{charword[20]={'0'};for(inti=0;i<=19;i++){[i]=word[i];myuser.psd[i]=word[i];}fclose(myfile);cout<<"已注销!"<<endl;return1;}voidMSysterm::outName()//打印登陆后的用户名{cout<<<<endl;}Myuserfile.cpp#include<iostream>#include<stdio.h>#include<iomanip>#include<limits>//用于清除残留的输入流#include"myuserfile.h"#include"allstruct.h”usingnamespacestd;intMUser::createFile()//增加文件{s_listms_list;s_filems_file;longnowaddress=0,f_address[10],num_char=0;//目录循环记录变量,数据块地址变量组,字符个数(文件大小)intf_ad_num=0,myerr=0,i=1;//写入的块数,是否在最终写入时失败(失败置1)charf_name[20]={''},m='0',e='\0',f_islock;longold_lastaddress=lastaddress;//上一个目录地址(用于出错回滚)myfile=fopen("test1.txt”,"r+");if(myfile==NULL){cout<<"读取磁盘失败!"<<endl;fclose(myfile);return-1;}fseek(myfile,48*5,0);//文件指针跳到目录区for(i=1;i<=50;i++,fseek(myfile,40,1),nowaddress++)//检查目录空间是否足够{if(fread(&ms_list.isuse,4,1,myfile)==0)//读取是否使用{cout<<"读取目录空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}if(ms_list.isuse==0)//如果读取到未使用则跳出检测{break;}}if(i==51){cout<<"目录空间已满!创建文件失败"<<endl;fclose(myfile);return-2;}fseek(myfile,48*5+44*50,0);//文件指针跳到数据区for(i=1;i<=200;i++,fseek(myfile,260,1))//检查数据空间是否足够(初步检查){if(fread(&ms_file.isuse,4,1,myfile)==0)//读取是否使用{cout<<"读取数据空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}if(ms_file.isuse==0)//如果有空白的数据块则跳出{break;}}if(i==201){cout<<"数据空间已满!创建文件失败"<<endl;fclose(myfile);return-2;}cout<<"请输入文件名(字母和数字,最多19个字符):"<<endl;cin>>f_name;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流fseek(myfile,48*5,0);//文件指针跳到目录区for(i=1;i<=50;i++)//检查文件名是否被使用{if(fread(&ms_list,sizeof(ms_list),1,myfile)==0)//读取目录{cout<<"读取目录空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}if(ms_list.isuse==1)//如果读取到未使用则跳出检测{if(isSame(f_name,ms_)==1){fclose(myfile);return-4;}}}for(;;){cout<<"文件由多少个字符m组成?(必须小于2550个字符)"<<endl;cin>>num_char;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流if(num_char<=2550){break;}cout<<"文件长度必须小于2550个字符。"<<endl;}ms_list.pointsize=num_char;cout<<"文件是否锁定?y锁定/n(或其他)自由读写"<<endl;//确定是否锁定cin>>f_islock;cin.clear();//清除流的错误标记cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流if(f_islock==,y'||f_islock==,Y,){ms_list.isfile=0;}else{ms_list.isfile=1;}fseek(myfile,48*5+44*50,0);//文件指针跳到数据区for(i=0;i<=199&&f_ad_num<=(num_char/255);i++,fseek(myfile,260,1))//检查数据空间是否足够{if(fread(&ms_file.isuse,4,1,myfile)==0){cout<<"读取数据空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;fclose(myfile);return-1;}if(ms_file.isuse==0)//如果有空白区块{f_address[f_ad_num]=i*264+48*5+44*50;//记录下当前空白区块的绝对物理地址f_ad_num++;//先用后加}}if(f_ad_num<=(num_char/255))//空白的地址不足{cout<<"没有足够的磁盘空间,创建失败!"<<endl;fclose(myfile);return-3;}ms_file.isuse=1;intk=0;//for循环变量for(i=0;i<f_ad_num;i++){if(i<(f_ad_num-1))〃对下个数据块进行链接{ms_file.next=f_address[i+1];}else{ms_file.next=0;}fseek(myfile,f_address[i],0);//跳转到空白数据块if(num_char>255)//数据太多,一个区块放不了{if(fwrite(&ms_file.isuse,4,1,myfile)==0)//写入已被使用{cout<<"数据模块写入isuse失败"<<endl;myerr=1;}for(k=1;k<=255;k++)//写入数据{if(fwrite(&m,1,1,myfile)==0){cout<<"数据模块写入内容失败"<<endl;myerr=1;}}if(fwrite(&e,1,1,myfile)==0)//写入结束符{cout<<"数据模块写入结束符失败"<<endl;myerr=1;}if(fwrite(&ms_file.next,4,1,myfile)==0)//写入下个数据块地址{cout<<"数据模块写入next失败"<<endl;myerr=1;}num_char-=255;else//数据小于一个区块的大小{if(fwrite(&ms_file.isuse,4,1,myfile)==0)//区块置为已使用{cout<<"数据模块写入isuse失败"<<endl;myerr=1;}for(k=1;k<=num_char;k++){if(fwrite(&m,1,1,myfile)==0){cout<<"数据模块写入内容失败"<<endl;myerr=1;}}for(k=1;k<=(256-num_char);k++)//写入数据{if(fwrite(&e,1,1,myfile)==0){cout<<"数据模块写入结束符失败"<<endl;myerr=1;}}if(fwrite(&ms_file.next,4,1,myfile)==0)//写入下个文件链接地址,就是写入0{cout<<"数据模块写入next失败"<<endl;myerr=1;}}//判断是否最后一个数据块结束}//数据块写入结束//开始写入目录区ms_list.isuse=1;for(i=0;i<=19;i++){ms_[i]=f_name[i];}ms_list.myaddress=nowaddress*44+48*5;//计算出地址ms_list.pointaddress=f_address[0];//赋值首个文件块地址ms_list.nextaddress=0;//由于if(lastaddress==0)//被写入的目录是首目录{fseek(myfile,ms_list.myaddress,0);if(fwrite(&ms_list,sizeof(ms_list),1,myfile)==0)//写入目录信息{cout<<"目录写入失败!"<<endl;myerr=2;fclose(myfile);return-3;}fseek(myfile,myaddress+44,0);if(fwrite(&ms_list.myaddress,4,1,myfile)==0)//将目录地址写入用户区的目录指针中{cout<<"目录写入失败2!"<<endl;myerr=3;fclose(myfile);return-3;}listaddress=ms_list.myaddress;lastaddress=ms_list.myaddress;}else{fseek(myfile,ms_list.myaddress,0);if(fwrite(&ms_list,44,1,myfile)==0)//写入目录信息{cout<<"目录写入失败!"<<endl;myerr=2;fclose(myfile);return-3;}fseek(myfile,lastaddress+40,0);if(fwrite(&ms_list.myaddress,4,1,myfile)==0)//与上一条目录链接{cout<<"目录写入失败2!"<<endl;myerr=3;fclose(myfile);return-3;}lastaddress=ms_list.myaddress;}}intMUser::delFile(charfilename[20])//删除文件{s_listms_list;s_filems_file;ms_file.isuse=0;longold_list_address=0;//用来记录被删除文件目录的上一个文件地址intisfind=0;myfile=fopen("test1.txt”,"r+");if(myfile==NULL){cout<<"读取磁盘失败!"<<endl;return-1;}ms_list.nextaddress=listaddress;ms_list.myaddress=listaddress;for(;ms_list.nextaddress!=0;)//读取文件的名字{old_list_address=ms_list.myaddress;fseek(myfile,ms_list.nextaddress,0);if(fread(&ms_list,sizeof(ms_list),1,myfile)==0){cout<<"循环读取目录失败,无法读取!"<<endl;fclose(myfile);return-2;if(isSame(ms_,filename)==1){isfind=1;break;}}if(isfind==0)//没有找到指定的文件{fclose(myfile);return-2;}if(ms_list.isfile==0)//文件被锁定{fclose(myfile);return-4;}zms_file.next=ms_list.pointaddress;//循环准备for(;ms_file.next!=0;){fseek(myfile,ms_file.next,0);if(fwrite(&ms_file.isuse,4,1,myfile)==0)//先把数据块改成未使用{cout<<"1"<<endl;fclose(myfile);return-4;}fseek(myfile,256,1);if(fread(&ms_file.next,4,1,myfile)==0)//读取下一个数据块地址{cout<<"2"<<endl;fclose(myfile);return-4;}}if(ms_list.myaddress==old_list_address)//这个文件的目录是首目录{fseek(myfile,myaddress+44,0);if(fwrite(&ms_list.nextaddress,4,1,myfile)==0){cout<<"3"<<endl;fclose(myfile);return-4;}fseek(myfile,ms_list.myaddress,0);if(fwrite(&ms_file.isuse,4,1,myfile)==0)//本来应该用ms_list.isuse,但是赋值麻烦,直接用file的。反正数据结构一样{cout<<"6"<<endl;fclose(myfile);return-4;}listaddress=ms_list.nextaddress;}else{fseek(myfile,old_list_address+40,0);//上一个目录的指向链接处if(fwrite(&ms_list.nextaddress,4,1,myfile)==0)cout<<"5"<<endl;fclose(myfile);return-4;}fseek(myfile,ms_list.myaddress,0);if(fwrite(&ms_file.isuse,4,1,myfile)==0)//本来应该用ms_list.isuse,但是赋值麻烦,直接用file的。反正数据结构一样{cout<<"6"<<endl;fclose(myfile);return-4;}}fclose(myfile);return1;}intMUser::revampFile(charfilename[20])//修改文件{s_listms_list;s_filems_file;intx=0;charnew_name[20]={'\0'};intisfind=0;myfile=fopen("test1.txt”,"r+");if(myfile==NULL){cout<<"读取磁盘失败!"<<endl;return-1;}ms_list.nextaddress=listaddress;for(;ms_list.nextaddress!=0;)//读取文件的名字并比较{fseek(myfile,ms_list.nextaddress,0);if(fread(&ms_list,sizeof(ms_list),1,myfile)==0){cout<<"循环读取目录失败,无法读取!"<<endl;fclose(myfile);return-2;}if(isSame(ms_,filename)==1){isfind=1;cout<<"输入内容:"<<endl;fseek(myfile,ms_list.pointaddress+4,0);chars[100];cin>>s;for(x=0;x<100;x++){if(s[x]==0){break;}if(ms_list.pointsize<x)return-5;if(fwrite(&s,100,1,myfile)==0){fclose(myfile);return-4;}fclose(myfile);break;}}if(isfind==0)//找不到指定的文件{fclose(myfile);return-2;}return1;}intMUser::mydir()//列出当前目录的所有文件(夹){inti=0;s_listms_list;if(listaddress==0){lastaddress=0;cout<<"此用户没有创建文件,目录为空!"<<endl;return0;}else{cout<<"文件名\t\t\t大小\t是否锁定\t物理地址"<<endl;}myfile=fopen("test1.txt”,"r”);if(myfile==NULL){cout<<"读取磁盘失败!"<<endl;return-1;}_zms_list.nextaddress=listaddress;//为进入循环做准备fseek(myfile,48*5,0);for(;ms_list.nextaddress!=0;)//循环读取目录{lastaddress=ms_list.nextaddress;fseek(myfile,ms_list.nextaddress,0);if(fread(&ms_list,sizeof(ms_list),1,myfile)==0)//读取目录{cout<<"循环读取目录失败,无法读取!"<<endl;fclose(myfile);return-2;}for(i=0;ms_[i]!='\0'&&i<=19;i++){//仅仅只为计数,方便规范输出if(i<=7)//规范输出{〃〃cout<<ms_<<"\t\t\t"<<ms_list.pointsize;}else{if(i<=15){〃〃cout<<ms_lis

温馨提示

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

评论

0/150

提交评论