操作系统课程设计二级文件系统Word文档下载推荐.docx
《操作系统课程设计二级文件系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计二级文件系统Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
3、源文件可以进行读写保护。
三、实验过程
1、程序流程
用户登录流程
列文件目录流程
2、主要类介绍
(1)、publicclassSystems文件系统的主类
(2)、publicclassMyFile自定义的文件结构体类
(3)、publicclassMyDirectory自定义的目录的结构体类
(4)、publicclassSuperBlockimplementsSerializable超级快结构体类
(5)、publicclassINodeimplementsSerializable,Comparable<
INode>
自定义INode节点实体类
(6)、publicclassFileTools自定义数据文件的读写工具类
四、设计思路
1、一个磁盘的有扇区(超级块)、索引块区(Inode节点区)、存储区(数据块区)
2、扇区中主要是存储磁盘的总大小、空闲Inode节点、使用的Inode节点、已使用空间、空闲空间。
3、Inode节点主要存储:
当前的地址、文件的长度、用户名、读写的权限、文件是否打开、文件的类型(0代表目录,1代表普通文件)、对应文件块的地址(即序号)、父节点块号、自己的当前节点的序号。
4、自定义目录:
文件对应Inode的索引、文件的名字、当前目录下的Inode和文件的对应关系(privateTreeMap<
Integer,Integer>
tree)
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<
String>
users;
//用户名数组;
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<
)FileTools.read("
f:
\\users.dat"
);
/*
*if(null!
=FileTools.read("
)){//inodes=(INode[])
*FileTools.read("
*/
sb=(SuperBlock)FileTools.read("
\\super.dat"
if(null==sb||sb.getAlreadyuse()==0){
for(inti=0;
i<
100;
i++){
inodes[i]=newINode();
}
sb=newSuperBlock();
sb.setInode_free(i);
FileTools.write("
sb);
}
if(null==users){
users=newArrayList<
();
//存放整个文件系统
users.add("
admin"
users);
publicvoidlogin(){
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()];
//得到当前的目录
登录成功"
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<
Integer>
dir_inodes=now__real_file.getTree()
.keySet();
Iterator<
iteratore=dir_inodes.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()+"
+real_inode.getAddress()+"
+real_inode.getLength()+"
B\t"
+real_inode.getRight()+"
+real_inode.getState()+"
+real_inode.getModifytime());
}else{
MyFilereal_file=(MyFile)file;
}
}
文件个数---"
+m);
}
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+"
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"
文件已关闭!
sb.setAlreadyuse(content.length());
sb.setInode_busy(index);
inode申请失败!
//创建文件目录
elseif(cmd[0].trim().equals("
mkdir"
MyDirectorymy_file=newMyDirectory();
inode.setPath(now_inode.getPath()+cmd[1]+"
inode.setType(0);
inodes[index].setLength(0);
//删除文件的操作
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{
目录不为空!
不可以删除"
}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()+"
文件已删除!
System.out.println(cmd[1]+"
文件不存在!
}elseif(cmd[0].trim().equals("
cd"
if("
."
.equals(cmd[1])){
}elseif("
.."
if(now_inode.getFather()