还剩18页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
操作系统课程设计报告二级文件系统(j__a)姓名李爱军班级计091-2学号200925501211指导教师翟一鸣日期2012-08-30目录TOC\o1-3\h\z\u
一、实验目的3
二、实验内容3
三、实验过程3
四、设计思路4
五、实现的功能5
六、实验感悟5附录程序主要代码5
一、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现
二、实验内容为linux系统设计一个简单的二级文件系统要求做到以下几点
1、可以实现下列几条命令(至少4条);login用户登陆dir列文件目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件
2、列目录时要列出文件名、物理地址、保护码和文件长度;
3、源文件可以进行读写保护
三、实验过程
1、程序流程用户登录流程列文件目录流程
2、主要类介绍
(1)、publicclassSystems文件系统的主类
(2)、publicclassMyFile自定义的文件结构体类
(3)、publicclassMyDirectory自定义的目录的结构体类
(4)、publicclassSuperBlockimplementsSerializable超级快结构体类
(5)、publicclassINodeimplementsSerializableComparableINode自定义INode节点实体类
(6)、publicclassFileTools自定义数据文件的读写工具类
四、设计思路
1、一个磁盘的有扇区(超级块)、索引块区(Inode节点区)、存储区(数据块区)
2、扇区中主要是存储磁盘的总大小、空闲Inode节点、使用的Inode节点、已使用空间、空闲空间
3、Inode节点主要存储当前的地址、文件的长度、用户名、读写的权限、文件是否打开、文件的类型(0代表目录,1代表普通文件)、对应文件块的地址(即序号)、父节点块号、自己的当前节点的序号
4、自定义目录文件对应Inode的索引、文件的名字、当前目录下的Inode和文件的对应关系(privateTree__pIntegerIntegertree)
5、自定应文件文件对应Inode的索引、文件名字、/数据内容
6、控制类得到用户的输入操作调用相应的操作
五、实现的功能
1、用户的注册和登陆
2、dir列文件目录
3、create创建文件
4、delete删除文件
5、read读文件
6、write写文件
7、cd更改目录
8、rename重命名文件名
六、实验感悟首先想说一句话“没被逼着是不会出大力的”解释一下,看到同学们用的都是以前的C或者是C++的文件代码我自己考来一份,这个悲催啊,自己的C\C++的功底实在是太差劲的,直接看不懂,也没那耐心烦从网上down了几份j__a的代码其中有一份写的不错,很巧妙的实现了老师的要求可是以真正的课程设计的原理真是风马牛不相及啊怕老师不让过,于是下决心自己写一下(觉得自己对相应的原理还是知道一些的)我的痛苦的过程也就开始了我真的有一次体味到写程序最难得不是代码的编写,而是思路、思路、思路前一天很容易的就实现了用户登录相应的操作同时数据读写的工具类和项目的框架也算是粗糙的完成了可是接下来就写不下去了,原因是Inode和file或者directory之间是如何关联的这三个类的属性是如何定义和分配的自己拿笔也在纸上画,又和舍友李新等同学探讨有思考了一天多,模模糊糊的开始写,又改有写就这样一点一点的写着改着,痛苦着并高兴着终于粗糙的写完了时间太短啊,还有许多可以优化的地方还没来得修改周五下午,怀着一颗忐忑的心找老师验程序当听到老师的一句“写的还不错么!”那种高兴无法用言语来形容!这几天的痛苦、熬夜都值了谢谢老师的夸奖!附录程序主要代码
1.Systems.j__a/***文件管理系统主类**@authorliaijun**/publicclassSystems{Scannersc=newScannerSystem.in;//从控制台读取数据publicstaticSuperBlock__=null;//超级块记录虚拟磁盘的总信息publicstaticArrayListStringusers;//用户名数组;publicstaticINode[]inodes=newINode
[100];//i节点记录数据结构publicstaticO__ect[]blocks=newO__ect
[100];//文件块的结构;publicstaticStringname=null;//当前登录用户名publicstaticINodenow_inode=null;//当前节点publicstaticO__ectnow_file=null;//publicstaticINodefather;//父节点//publicstaticINodeme;//自己的当前节点/***@paramargs*/publicstaticvoid__inString[]args{Systemssts=newSystems;sts.init;//初始化数据;sts.login;}publicvoidinit{users=ArrayListStringFileTools.readf:\\users.dat;/**ifnull!=FileTools.readf:\\users.dat{//inodes=INode[]*FileTools.readf:\\users.dat;}*/__=SuperBlockFileTools.readf:\\super.dat;ifnull==__||__.getAlreadyuse==0{forinti=0;i100;i++{inodes[i]=newINode;}__=newSuperBlock;forinti=0;i100;i++{__.setInode_freei;}FileTools.writef:\\super.dat__;}ifnull==users{users=newArrayListString;//存放整个文件系统users.addadmin;FileTools.writef:\\users.datusers;}}publicvoidlogin{name=sc.next;if!this.isInNamesname{ify.equalssc.next{ifregeistname{login;}else{System.exit0;}}else{login;}}else{now_inode=getInodename+-;//得到当前的inodenow_file=blocks[now_inode.getAddress];//得到当前的目录execute;}}/***命令执行的主方法*/publicvoidexecute{Stringcommond=null;Stringcmd[]=null;//操作命令数组cmd
[0]操作的命令cmd
[1]操作的文件/**INodeid=newINode;//文件的节点intfileNumber=0;//拥有文件的总数int*getNumber=0;//存储打开文件的节点索引号,或者说是虚拟的内存地址intemptyNumber=0;//*空的文件目录的索引whiletrue{commond=sc.nextLine;ifcommond.equalscommond=sc.nextLine;cmd=commond.trim.split;//列举同一个人用户名的文件目录ifcmd
[0].trim.equalsdir{intm=0;ifnow_fileinstan__ofMyDirectory{MyDirectorynow__real_file=MyDirectorynow_file;m=now__real_file.getTree.size;ifm==0{}else{SetIntegerdir_inodes=now__real_file.getTree.keySet;IteratorIntegeriteratore=dir_inodes.iterator;whileiteratore.hasNext{O__ectfile=blocks[now__real_file.getTree.getiteratore.next];iffileinstan__ofMyDirectory{MyDirectoryreal_file=MyDirectoryfile;INodereal_inode=inodes[real_file.getInode_address];//文件名\t用户名\t地址\t文件长度\t只读1/可写2\t打开控制\t创建时间+real_inode.getUsers+\t+real_inode.getAddress+\t+real_inode.getLength+B\t+real_inode.getRight+\t+real_inode.getState+\t+real_inode.getModifytime;}else{MyFilereal_file=MyFilefile;INodereal_inode=inodes[real_file.getInode_address];+real_inode.getUsers+\t+real_inode.getAddress+\t+real_inode.getLength+B\t+real_inode.getRight+\t+real_inode.getState+\t+real_inode.getModifytime;}}}}else{MyFilenow__real_file=MyFilenow_file;}}//创建文件elseifcmd
[0].equalscreate{intindex=getFreeInode;ifindex!=-1{MyFilemy_file=newMyFile;my_file.setNamecmd
[1];INodeinode=newINode;inode.setFathernow_inode.getMe;inode.setUsersname;inode.setMeindex;inode.setModifytime;ifinode.getFather==-1{inode.setPathname+-;}else{inode.setPathinodes[inode.getFather].getPath+cmd
[1]+-;}inode.setRight1;//可写inode.setStateopen;inode.setType1;//文件inode.setAddressindex;inodes[index]=inode;my_file.setInode_addressindex;MyDirectoryreal_file=MyDirectorynow_file;blocks[index]=my_file;real_file.getTree.putindexindex;StringBuffercontent=newStringBuffer;whiletrue{Stringtem=sc.nextLine;iftem.equals#end{break;//文件输入结束}content.appendtem+\r\n;}my_file.setSubstan__content.toString;inodes[index].setLengthcontent.length;inodes[index].setStateclose;__.setAlreadyusecontent.length;__.setInode_busyindex;}else{}}//创建文件目录elseifcmd
[0].trim.equalsmkdir{intindex=getFreeInode;ifindex!=-1{MyDirectorymy_file=newMyDirectory;my_file.setNamecmd
[1];INodeinode=newINode;inode.setFathernow_inode.getMe;inode.setUsersname;inode.setMeindex;inode.setModifytime;inode.setPathnow_inode.getPath+cmd
[1]+-;inode.setRight1;//可写inode.setType0;//文件inode.setAddressindex;inodes[index]=inode;my_file.setInode_addressindex;MyDirectoryreal_file=MyDirectorynow_file;blocks[index]=my_file;real_file.getTree.putindexindex;inodes[index].setLength0;__.setInode_busyindex;}else{}}//删除文件的操作elseifcmd
[0].trim.equalsdelete{O__ecto=this.getFileByNamecmd
[1];ifnull!=o{ifoinstan__ofMyDirectory{MyDirectoryo1=MyDirectoryo;ifo
1.getTree.size==0{intindex=o
1.getInode_address;__.setInode_freeindex;//重置节点inodes[index]=newINode;//重置数据块blocks[o
1.getInode_address]=newO__ect;//在目录的tree中删除数据MyDirectoryfile=MyDirectorynow_file;file.getTree.removeindex;}else{}}elseifoinstan__ofMyFile{MyFileo1=MyFileo;intindex=o
1.getInode_address;//设置超级快__.setInode_freeindex;__.setFreeuseinodes[index].getLength;//重置节点inodes[index]=newINode;//重置数据块blocks[o
1.getInode_address]=newO__ect;//在目录的tree中删除数据MyDirectoryfile=MyDirectorynow_file;file.getTree.removeindex;}else{}}}elseifcmd
[0].trim.equalscd{if..equalscmd
[1]{}elseif...equalscmd
[1]{ifnow_inode.getFather==-1{}else{MyDirectorynow_directory=MyDirectorynow_file;now_inode=inodes[now_inode.getFather];now_file=blocks[now_inode.getAddress];}}elseifnull!=getFileByNamecmd
[1]{O__ecto1=getFileByNamecmd
[1];ifo1instan__ofMyDirectory{MyDirectoryo=MyDirectoryo1;now_file=o;now_inode=inodes[o.getInode_address];}else{}}else{}}elseifcmd
[0].trim.equalsopen{//没时间写了}elseifcmd
[0].trim.equalsclose{//没时间写了}elseifcmd
[0].trim.equalsrename{ifrenamecmd{}else{}}//read操作(文件已经打开的话可移执行文件的读操作,如果文件没有打开,则可以执行文件的读操作否则不可以)elseifcmd
[0].trim.equalsread{O__ecto=this.getFileByNamecmd
[1];ifnull!=o{ifoinstan__ofMyDirectory{MyDirectoryo1=MyDirectoryo;}elseifoinstan__ofMyFile{MyFileo1=MyFileo;o
1.getSubstan__.lastIndexOf\r\n;}}}elseifcmd
[0].trim.equalswrite{O__ecto=this.getFileByNamecmd
[1];ifnull!=o{ifoinstan__ofMyDirectory{MyDirectoryo1=MyDirectoryo;}elseifoinstan__ofMyFile{MyFileo1=MyFileo;Stringselect=sc.next;whiletrue{if
1.equalsselect{StringBuffercontent=newStringBuffero
1.getSubstan__.substring0o
1.getSubstan__.lastIndexOf\r\n;whiletrue{Stringtem=sc.next;iftem.equals#end{break;//文件输入结束}content.appendtem+\r\n;}o
1.setSubstan__content.toString;break;}elseif
2.equalsselect{StringBuffercontent=newStringBuffer;whiletrue{Stringtem=sc.next;iftem.equals#end{break;//文件输入结束}content.appendtem+\r\n;}o
1.setSubstan__content.toString;break;}else{select=sc.next;}}}}else{}}//退出操作---保存数据elseifcmd
[0].trim.equalsexit{System.exit0;}//help操作elseifcmd
[0].trim.equalshelp{help;}else{}}}/***regeistStringname注册用户**@paramname*/publicbooleanregeistStringname{intinode_free_index=this.getFreeInode;ifinode_free_index-1{now_inode=inodes[inode_free_index];now_inode.setAddressinode_free_index;//文件快的地址now_inode.setModifytime;now_inode.setRight1;now_inode.setStateclose;now_inode.setType0;now_inode.setUsersname;now_inode.setPathname+-;now_inode.setMeinode_free_index;//当前Inode的索引inodes[inode_free_index]=now_inode;MyDirectoryblock=newMyDirectory;block.setNamename;blocks[inode_free_index]=block;users.addname;FileTools.writef:\\users.datusers;FileTools.writef:\\inodes.datinodes;returntrue;}returnfalse;}publicvoidhelp{}privateO__ectgetFileByNameStringname{forO__ecto:blocks{ifoinstan__ofMyDirectory{MyDirectoryo1=MyDirectoryo;ifo
1.getName.equalsname{returno1;}}elseifoinstan__ofMyFile{MyFileo1=MyFileo;ifo
1.getName.equalsname{returno1;}}}returnnull;}/***isInNamesStringname判断用户名是否存在**@paramname*@return*/privatebooleanisInNamesStringname{forStringn:users{ifn.equalsnamereturntrue;}returnfalse;}/***getFreeInode得到空的inode**@return*/privateintgetFreeInode{return__.getInode_free;}/***getInodeStringpath由path得到Inode**@paramname*@return*/privateINodegetInodeStringpath{forinti=0;i100;i++{ifpath.equalsinodes[i].getPath{returninodes[i];}}returnnull;}/***getBlock得到空闲的block的序号**@paramname*@return*/privateintgetBlock{forinti=0;i100;i++{ifnull==blocks[i]{returni;}}return-1;}/***renameString[]cmd重命名函数**@paramcmd*@return*/privatebooleanrenameString[]cmd{ifcmd.length3{returnfalse;}O__ecto=getFileByNamecmd
[1];ifnull==oreturnfalse;else{ifoinstan__ofMyDirectory{MyDirectoryoo=MyDirectoryo;oo.setNamecmd
[2];//inode.setPathnow_inode.getPath+cmd
[1]+-;inodes[oo.getInode_address].setPathnow_inode.getPath+cmd
[2]+-;returntrue;}else{MyFileoo=MyFileo;oo.setNamecmd
[2];returntrue;}}}}/***Stringuser;用户intlength;文件的长度intright;文件的读写权限//0只读/1只写String*state;文件是否打开的标志Stringmodifytime;文件的修改时间address;//对应文件块的地址---即序号**Stringpath路径;*@authorliaijun**/publicclassINodeimplementsSerializableComparableINode{privateStringpath=;//当前的地址privateintlength=0;privateStringusers=;privateintright=1;//0只读/1只写privateStringstate=close;//文件是否打开的标志privateStringmodifytime;//修改时间privateinttype=0;/*0代表目录,1代表普通文件*/privateintaddress=-1;//对应文件块的地址---即序号privateintfather=-1;//父节点privateintme=-1;//自己的当前节点publicintgetFather{returnfather;}publicvoidsetFatherintfather{this.father=father;}publicintgetMe{returnme;}publicvoidsetMeintme{this.me=me;}publicStringgetPath{returnpath;}publicvoidsetPathStringpath{this.path=path;}publicintgetType{returntype;}publicvoidsetTypeinttype{this.type=type;}publicStringgetUsers{returnusers;}publicvoidsetUsersStringusers{this.users=users;}publicintgetLength{returnlength;}publicvoidsetLengthintlength{this.length=length;}publicStringgetRight{ifthis.right==0returnR;elsereturnW;}publicvoidsetRightintright{this.right=right;}publicStringgetState{returnstate;}publicvoidsetStateStringstate{this.state=state;}publicStringgetModifytime{returnmodifytime;}/***setModifytime设定文件的最后修改日期*/@TestpublicvoidsetModifytime{Datedate=newDate;______DateFor__tadf=new______DateFor__tyyyy/MM/ddHH:mm;this.modifytime=adf.for__tdate;}publicStringtoString{returnthis.getUsers+\t+this.getLength+b\t+this.getRight+\t+this.getModifytime;}publicintgetAddress{returnaddress;}publicvoidsetAddressintaddress{this.address=address;}/***Comparable的方法,为了实现INode的有序;*/@OverridepublicintcompareToINodeo{}}
3.SuperBlock.j__apublicclassSuperBlockimplementsSerializable{privatelongtotalcontent=1000;privatelongalreadyuse=0;privatelongfreeuse=1000;//privateINode[]inodes=null;//i节点记录数据结构privateArrayListIntegerinode_free=newArrayListInteger;//剩余inode节点privateArrayListIntegerinode_busy=newArrayListInteger;//已用INode节点publiclonggetTotalcontent{returntotalcontent;}publiclonggetAlreadyuse{returnalreadyuse;}publicvoidsetAlreadyuselongalreadyuse{this.alreadyuse=alreadyuse;this.freeuse=this.getTotalcontent-this.alreadyuse;}publiclonggetFreeuse{returnthis.freeuse;}publicvoidsetFreeuselongfreeuse{this.freeuse=freeuse;this.alreadyuse=this.getTotalcontent-this.getFreeuse;}/***getInode_free得到一个空闲的Inode的索引-1表示获取失败*@return*/publicintgetInode_free{{iftem-1tem100{returntem;}}return-1;}/***setInode_freeintinode_free将intinode_free的Inode索引设置为空闲*@paraminode_free*/publicvoidsetInode_freeintinode_free{ifinode_free-1inode_free100{{}}else{}}/***getInode_busy得到一个忙的Inode的索引*@return-1表示获取失败*/publicintgetInode_busy{{iftem-1tem100{returntem;}}return-1;}/***setInode_busyintinode_busy将inode_busy加入到忙的队列*@paraminode_busy*/publicvoidsetInode_busyintinode_busy{ifinode_busy-1inode_busy100{}else{}}}
4.MyDirectory.j__a/***MyDirectory目录存储结构**@authorliaijun**/publicclassMyDirectory{privateintinode_address=-1;//记录文件对应Inode的索引privateStringname=;privateTree__pIntegerIntegertree=newTree__pIntegerInteger;publicintgetInode_address{returninode_address;}publicvoidsetInode_addressintinode_address{this.inode_address=inode_address;}/***StringgetName得到目录的名字**@return*/publicStringgetName{returnname;}/***setNameStringname设置目录的名字**@paramname*/publicvoidsetNameStringname{this.name=name;}/***Tree__pINodeIntegergetTree得到该目录下的所有内容**@return*/publicTree__pIntegerIntegergetTree{returntree;}/***setTreeTree__pINodeIntegertree设置存放目录文件的Tree__p**@paramtree*/publicvoidsetTreeTree__pIntegerIntegertree{this.tree=tree;}/***setTreeINodeinodeintsub向目录文件的Tree__p添加数据**@paraminode*@paramsub*/publicvoidsetTreeINodeinodeintsub{}}
5.MyFile.j__a/***MyFile文件存储结构*Stringname文件名字*substan__数据内容*@authorliaijun**/publicclassMyFile{privateintinode_address=-1;//记录文件对应Inode的索引privateStringname=;//文件名字privateStringsubstan__=;//数据内容publicintgetInode_address{returninode_address;}publicvoidsetInode_addressintinode_address{this.inode_address=inode_address;}/***getName得到文件名字*@return*/publicStringgetName{returnname;}/***setNameStringname设置文件*@paramname*/publicvoidsetNameStringname{this.name=name;}/***StringgetSubstan__得到文件的内容*@return*/publicStringgetSubstan__{returnsubstan__;}/***setSubstan__Stringsubstan__设置文件的内容*@paramsubstan__*/publicvoidsetSubstan__Stringsubstan__{this.substan__=substan__;}}
6.FileTools.j__a/***FileTools文件操作的工具类**@authorliaijun**/publicclassFileTools{/***O__ectreadStringname读取name文件返回o__ect类型的数据**@paramname*@return*/publicstaticO__ectreadStringname{Filefile=newFilename;O__ectInputStreamoin=null;O__ecto__=null;try{oin=newO__ectInputStreamnewFileInputStreamname;o__=oin.readO__ect;}catchEOFEx__ptione1{}catchFileNotFoundEx__ptione{writenamenull;readname;}catchIOEx__ptione{e.printStackTra__;}catchClassNotFoundEx__ptione{e.printStackTra__;}try{ifnull!=oinoin.close;}catchIOEx__ptione{//TODOAuto-generatedcatchblock}returno__;}/***writeStringnameO__ecto向name目录文件写入所给的对象**@paramname*@paramo*/publicstaticvoidwriteStringnameO__ecto{Filefile=newFilename;O__ectOutputStreamoout=null;if!file.exists{try{file.createNewFile;}catchIOEx__ptione{}}try{oout=newO__ectOutputStreamnewFileOutputStreamfile;ifnull!=o{oout.writeO__ecto;}}catchIOEx__ptione{//TODOAuto-generatedcatchblock}finally{try{ifnull!=ooutoout.close;}catchIOEx__ptione{//TODOAuto-generatedcatchblock}}}}登录输入用户名用户存在进入目录管理注册登陆完成否是列出目录文件读取文件展示文件完成是否当前用户文件否是。