操作系统课程设计二级文件系统.docx
- 文档编号:7732955
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:34
- 大小:49.26KB
操作系统课程设计二级文件系统.docx
《操作系统课程设计二级文件系统.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计二级文件系统.docx(34页珍藏版)》请在冰豆网上搜索。
操作系统课程设计二级文件系统
操作系统课程设计报告
二级文件系统(java)
姓名:
李爱军
班级:
计091-2
学号:
200925501211
指导教师:
翟一鸣
日期:
2012-08-30
目录
一、实验目的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)、publicclassINodeimplementsSerializable,Comparable
(6)、publicclassFileTools自定义数据文件的读写工具类
四、设计思路
1、一个磁盘的有扇区(超级块)、索引块区(Inode节点区)、存储区(数据块区)
2、扇区中主要是存储磁盘的总大小、空闲Inode节点、使用的Inode节点、已使用空间、空闲空间。
3、Inode节点主要存储:
当前的地址、文件的长度、用户名、读写的权限、文件是否打开、文件的类型(0代表目录,1代表普通文件)、对应文件块的地址(即序号)、父节点块号、自己的当前节点的序号。
4、自定义目录:
文件对应Inode的索引、文件的名字、当前目录下的Inode和文件的对应关系(privateTreeMap
5、自定应文件:
文件对应Inode的索引、文件名字、/数据内容。
6、控制类:
得到用户的输入操作调用相应的操作。
五、实现的功能
1、用户的注册和登陆
2、dir列文件目录
3、create创建文件
4、delete删除文件
5、read读文件
6、write写文件
7、cd更改目录
8、rename重命名文件名
六、实验感悟
首先想说一句话:
“没被逼着是不会出大力的”。
解释一下,看到同学们用的都是以前的C或者是C++的文件代码。
我自己考来一份,这个悲催啊,自己的C\C++的功底实在是太差劲的,直接看不懂,也没那耐心烦。
从网上down了几份java的代码。
其中有一份写的不错,很巧妙的实现了老师的要求。
可是以真正的课程设计的原理真是风马牛不相及啊。
怕老师不让过,于是下决心自己写一下(觉得自己对相应的原理还是知道一些的)。
我的痛苦的过程也就开始了。
我真的有一次体味到写程序最难得不是代码的编写,而是思路、思路、思路。
前一天很容易的就实现了用户登录相应的操作。
同时数据读写的工具类和项目的框架也算是粗糙的完成了。
可是接下来就写不下去了,原因是Inode和file或者directory之间是如何关联的。
这三个类的属性是如何定义和分配的。
自己拿笔也在纸上画,又和舍友李新等同学探讨。
有思考了一天多,模模糊糊的开始写,又改有写。
就这样一点一点的写着改着,痛苦着并高兴着。
终于粗糙的写完了。
时间太短啊,还有许多可以优化的地方还没来得修改。
周五下午,怀着一颗忐忑的心找老师验程序。
当听到老师的一句:
“写的还不错么!
”那种高兴无法用言语来形容!
这几天的痛苦、熬夜都值了。
谢谢老师的夸奖!
附录:
程序主要代码
1.Systems.java
importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.Scanner;
importjava.util.Set;
importjava.util.StringTokenizer;
/**
*文件管理系统主类
*
*@authorliaijun
*
*/
publicclassSystems{
Scannersc=newScanner(System.in);//从控制台读取数据
publicstaticSuperBlocksb=null;//超级块记录虚拟磁盘的总信息
publicstaticArrayList
publicstaticINode[]inodes=newINode[100];//i节点记录数据结构
publicstaticObject[]blocks=newObject[100];//文件块的结构;
publicstaticStringname=null;//当前登录用户名
publicstaticINodenow_inode=null;//当前节点
publicstaticObjectnow_file=null;
//publicstaticINodefather;//父节点
//publicstaticINodeme;//自己的当前节点
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Systemssts=newSystems();
sts.init();//初始化数据;
sts.login();
}
publicvoidinit(){
users=(ArrayList
\\users.dat");
/*
*if(null!
=FileTools.read("f:
\\users.dat")){//inodes=(INode[])
*FileTools.read("f:
\\users.dat");}
*/
sb=(SuperBlock)FileTools.read("f:
\\super.dat");
if(null==sb||sb.getAlreadyuse()==0){
for(inti=0;i<100;i++){
inodes[i]=newINode();
}
sb=newSuperBlock();
for(inti=0;i<100;i++){
sb.setInode_free(i);
}
FileTools.write("f:
\\super.dat",sb);
}
if(null==users){
users=newArrayList
users.add("admin");
FileTools.write("f:
\\users.dat",users);
}
}
publicvoidlogin(){
System.out.println("***************欢迎使用该文件管理系统*************");
System.out.println("请先登录->");
name=sc.next();
if(!
this.isInNames(name)){
System.out.println("该用户名不存在!
是否注册该用户?
y/n");
if("y".equals(sc.next())){
if(regeist(name)){
System.out.println(name+"注册成功!
");
login();
}else{
System.out.println("注册失败!
");
System.exit(0);
}
}else{
login();
}
}else{
now_inode=getInode(name+"->");//得到当前的inode
now_file=blocks[now_inode.getAddress()];//得到当前的目录
System.out.println("登录成功");
execute();
}
}
/**
*命令执行的主方法
*/
publicvoidexecute(){
Stringcommond=null;
Stringcmd[]=null;//操作命令数组cmd[0]操作的命令cmd[1]操作的文件
/*
*INodeid=newINode();//文件的节点intfileNumber=0;//拥有文件的总数int
*getNumber=0;//存储打开文件的节点索引号,或者说是虚拟的内存地址intemptyNumber=0;//
*空的文件目录的索引
*///System.out.println(now_inode.getPath());
while(true){
System.out.print(now_inode.getPath());
commond=sc.nextLine();
if(commond.equals(""))
commond=sc.nextLine();
cmd=commond.trim().split("");
//列举同一个人用户名的文件目录
if(cmd[0].trim().equals("dir")){
intm=0;
System.out.println("文件名\t用户名\t地址\t文件长度\t只读1/可写2\t打开控制");
if(now_fileinstanceofMyDirectory){
MyDirectorynow__real_file=(MyDirectory)now_file;
m=now__real_file.getTree().size();
if(m==0){
System.out.println("没有目录项");
}else{
Set
.keySet();
Iterator
while(iteratore.hasNext()){
Objectfile=blocks[now__real_file.getTree().get(
iteratore.next())];
if(fileinstanceofMyDirectory){
MyDirectoryreal_file=(MyDirectory)file;
INodereal_inode=inodes[real_file
.getInode_address()];
//"文件名\t用户名\t地址\t文件长度\t只读1/可写2\t打开控制\t创建时间"
System.out.println(real_file.getName()+"\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=(MyFile)file;
INodereal_inode=inodes[real_file
.getInode_address()];
System.out.println(real_file.getName()+"\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());
}
}
System.out.println("文件个数---"+m);
}
}else{
MyFilenow__real_file=(MyFile)now_file;
}
}
//创建文件
elseif(cmd[0].equals("create")){
intindex=getFreeInode();
if(index!
=-1){
MyFilemy_file=newMyFile();
my_file.setName(cmd[1]);
INodeinode=newINode();
inode.setFather(now_inode.getMe());
inode.setUsers(name);
inode.setMe(index);
inode.setModifytime();
if(inode.getFather()==-1){
inode.setPath(name+"->");
}else{
inode.setPath(inodes[inode.getFather()].getPath()
+cmd[1]+"->");
}
inode.setRight
(1);//可写
inode.setState("open");
inode.setType
(1);//文件
inode.setAddress(index);
inodes[index]=inode;
my_file.setInode_address(index);
MyDirectoryreal_file=(MyDirectory)now_file;
blocks[index]=my_file;
real_file.getTree().put(index,index);
System.out.println(cmd[1]+"文件已经打开!
请输入内容。
。
。
#end结束输入");
StringBuffercontent=newStringBuffer();
while(true){
Stringtem=sc.nextLine();
if(tem.equals("#end")){
System.out.println("文件输入结束");
break;//文件输入结束
}
content.append(tem+"\r\n");
}
my_file.setSubstance(content.toString());
inodes[index].setLength(content.length());
inodes[index].setState("close");
System.out.println(cmd[1]+"文件已关闭!
");
sb.setAlreadyuse(content.length());
sb.setInode_busy(index);
}else{
System.out.println("inode申请失败!
");
}
}
//创建文件目录
elseif(cmd[0].trim().equals("mkdir")){
intindex=getFreeInode();
if(index!
=-1){
MyDirectorymy_file=newMyDirectory();
my_file.setName(cmd[1]);
INodeinode=newINode();
inode.setFather(now_inode.getMe());
inode.setUsers(name);
inode.setMe(index);
inode.setModifytime();
inode.setPath(now_inode.getPath()+cmd[1]+"->");
inode.setRight
(1);//可写
inode.setType(0);//文件
inode.setAddress(index);
inodes[index]=inode;
my_file.setInode_address(index);
MyDirectoryreal_file=(MyDirectory)now_file;
blocks[index]=my_file;
real_file.getTree().put(index,index);
inodes[index].setLength(0);
sb.setInode_busy(index);
}else{
System.out.println("inode申请失败!
");
}
}
//删除文件的操作
elseif(cmd[0].trim().equals("delete")){
Objecto=this.getFileByName(cmd[1]);
if(null!
=o){
if(oinstanceofMyDirectory){
MyDirectoryo1=(MyDirectory)o;
if(o1.getTree().size()==0){
intindex=o1.getInode_address();
sb.setInode_free(index);
//重置节点
inodes[index]=newINode();
//重置数据块
blocks[o1.getInode_address()]=newObject();
//在目录的tree中删除数据
MyDirectoryfile=(MyDirectory)now_file;
file.getTree().remove(index);
System.out.println(o1.getName()+"目录已删除!
");
}else{
System.out.println(o1.getName()+"目录不为空!
不可以删除");
}
}elseif(oinstanceofMyFile){
MyFileo1=(MyFile)o;
intindex=o1.getInode_address();
//设置超级快
sb.setInode_free(index);
sb.setFreeuse(inodes[index].getLength());
//重置节点
inodes[index]=newINode();
//重置数据块
blocks[o1.getInode_address()]=newObject();
//在目录的tree中删除数据
MyDirectoryfile=(MyDirectory)now_file;
file.getTree().remove(index);
System.out.println(o1.getName()+"文件已删除!
");
}else{
System.out.println(cmd[1]+"文件不存在!
");
}
}
}elseif(cmd[0].trim().equals("cd")){
if(".".equals(cmd[1])){
}elseif("..".equals(cmd[1])){
if(now_inode.getFather()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 二级 文件系统
![提示](https://static.bdocx.com/images/bang_tan.gif)