操作系统课程设计文件管理二级文件系统.docx
《操作系统课程设计文件管理二级文件系统.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文件管理二级文件系统.docx(54页珍藏版)》请在冰豆网上搜索。
操作系统课程设计文件管理二级文件系统
本文档分别包含linux和windows两套程序
一、课程设计的目的
二、课程设计的内容及要求
内容
要求
三、实现原理
四、关键算法实现流程图
流程图
关键算法
五、软件运行环境及限制
六.结果输出及分析
七.心得体会
八.参考文献
一.课程设计的目的
本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了我的动手能力。
二.课程设计的内容及要求
内容:
为LINUX设计一个简单的二级文件系统。
要求做到以下几点:
1、可以实现下列几条命令(至少4条)。
Login用户登录
Dir列文件目录
Create创建文件
Delete删除文件
Open打开文件
Close关闭文件
Read读文件
Write写文件
2、列目录时要列出文件名、物理地址、保护码和文件长度。
3、源文件可以进行读写保护。
从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:
1、鼓励并优先个人独立选题设计,可从下面设计题目中选择,也可以自拟相关题目;如要合作,每组最多两名同学,且设计文档不能相同;
2、可以在我们实验课最后布置的实验设计基础上进行完善和改进,但不能相同。
3、题目选定后报给班长,班长要注意班级内题目的平衡,根据所选题目进行协调,不要都选一样的题。
4、设计完成后报请老师答辩,答辩时不能对自己提供的设计进行讲解的同学,视为抄袭;
5、要求写出一份详细的设计报告(A4纸)。
6、每位同学在周五将自己的设计报告和电子文档(包括报告和源程序)交给学习委员,并由学习委员统一刻盘后上交。
三.实现原理
首先,实现Login用户登录,(用户名:
admin密码:
admin)必须登录成功才能进入文件系统进行查看,进入后,通过树状展示文件目录(默认文件目录是C:
\ProgramFiles),右侧显示文件夹图标或者文件图标,选中节点鼠标右击弹出菜单,有新建目录,新建文件,删除文件,打开文件,属性菜单项,并分别实现其功能。
四.关键算法实现流程图
流程图:
关键算法:
1.新建目录功能的实现
privateclassMenuAction2implementsActionListener{
publicvoidactionPerformed(ActionEventarg0){
try{
StringName=JOptionPane.showInputDialog("创建目录名称:
");
if(!
Name.equals("")){
//得到树状视图的被选择节点路径
TreePathpath=tree.getSelectionPath();
//得到树状视图的被选择节点
MutableTreeNodenode=(MutableTreeNode)path
.getLastPathComponent();
//得到树状视图的模型类变量
DefaultTreeModelmodel=(DefaultTreeModel)tree.getModel();
//新建子节点,标题为新目录名称
MutableTreeNodenewNode=newDefaultMutableTreeNode(Name);
//先展开树状视图,触发展开树状视图事件,给当前节点追加下级节点
tree.fireTreeExpanded(path);
//如果当前节点允许存在下级节点,则在树状视图的模型类变量中插入新子节点,位置是第一个,否则显示消息并退出该函数
if(node.getAllowsChildren())
model.insertNodeInto(newNode,node,0);
else{
JOptionPane.showMessageDialog(null,"不能给文件追加下级目录!
");
return;
}
//得到被选择节点对应文件的完整路径信息
StringfullPath="";
for(Objectobj:
path.getPath()){
Stringstr=obj.toString();
//处理盘符根目录问题
if(str.endsWith("\\"))
str=str.substring(0,str.length()-1);
if(fullPath.equals(""))
fullPath+=str;
else
fullPath+="\\"+str;
}
//System.out.println("fullpath="+fullPath);
//生成被选择节点对应的文件类变量
FileparentDir=newFile(fullPath);
//如果是目录,则新建相应的子目录
if(parentDir.isDirectory()){
FilecurrentFile=newFile(fullPath+"\\"+Name);
currentFile.mkdir();
}
}
else{
JOptionPane.showMessageDialog(null,"文件名不能为空!
");
}
}catch(HeadlessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
2.新建文件功能的实现
privateclassMenuAction5implementsActionListener{
publicvoidactionPerformed(ActionEvente){
TreePathtp=tree.getSelectionPath();
//得到被选择节点对应文件的完整路径信息
StringfullPath="";
for(Objectobj:
tp.getPath()){
Stringstr=obj.toString();
//处理盘符根目录问题
if(str.endsWith("\\"))
str=str.substring(0,str.length()-1);
if(fullPath.equals(""))
fullPath+=str;
else
fullPath+="\\"+str;
}
StringFileName=JOptionPane.showInputDialog("创建文件名称:
");
if(!
FileName.equals(null)){
Filef=newFile(fullPath+"\\"+FileName);
try{
f.createNewFile();
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
}else{
JOptionPane.showMessageDialog(null,"文件名不能为空!
");
}
}
}
3.删除功能的实现
//内部类,响应快捷菜单的单击操作
privateclassMenuActionimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
//得到树状视图的被选择节点路径
TreePathtp=tree.getSelectionPath();
//得到树状视图的被选择节点
DefaultMutableTreeNodenode=(DefaultMutableTreeNode)tp
.getLastPathComponent();
//从树状视图删除当前节点
DefaultTreeModeldtm=(DefaultTreeModel)tree.getModel();
dtm.removeNodeFromParent(node);
//得到被选择节点对应文件的完整路径信息
StringfullPath="";
for(Objectobj:
tp.getPath()){
Stringstr=obj.toString();
//处理盘符根目录问题
if(str.endsWith("\\"))
str=str.substring(0,str.length()-1);
if(fullPath.equals(""))
fullPath+=str;
else
fullPath+="\\"+str;
}
//如果是文件,直接删除,如果是目录则调用deleteDir函数删除目录
FilecurrentFile=newFile(fullPath);
if(currentFile.isFile())
currentFile.delete();
else
deleteDir(currentFile);
}
};
//通过递归调用,可以删除目录的函数
publicstaticbooleandeleteDir(Filedir){
//判断是否为目录,如果是,则递归调用自己,如果不是,直接删除文件
if(dir.isDirectory()){
String[]subDir=dir.list();
for(Strings:
subDir){
deleteDir(newFile(dir,s));
}
}
returndir.delete();
}
4.打开文件的功能实现
即是Open_File这个类。
5.属性的功能实现
取得路径名:
TreePathtp=tree.getSelectionPath();
//得到被选择节点对应文件的完整路径信息
StringfullPath="";
for(Objectobj:
tp.getPath()){
Stringstr=obj.toString();
//处理盘符根目录问题
if(str.endsWith("\\"))
str=str.substring(0,str.length()-1);
if(fullPath.equals(""))
fullPath+=str;
else
fullPath+="\\"+str;
}
然后传入newProper(fullPath);
属性详细实现即是Proper类。
五.软件运行环境及限制
运行环境:
JDK1.6
使用语言:
Java
编程工具:
JBuilder2007
错误提示框
进入系统后主界面:
菜单选项:
新建目录“小小”
新建文件“小小”
删除“小小”目录及文件
删除成功
打开文件
查看文件属性
七.心得体会
操作系统课程设计,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识与掌握。
比如对树的展示有了很好的学习,对二级文件系统也有了很好的了解,如何解决实现里面功能的各种问题。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习java语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
八.参考文献
[1]朱福喜,尹为民等编著.Java语言与面向对象程序设计.武汉:
武汉大学出版社,2002.12
[2]陆昌辉,Java程序设计实用案例教程.北京:
电子工业出版社,2008.5
[3]丁振凡,黎章等编著.Java语言实用教程..北京:
北京邮电大学出版社,2005.8
[4]何桥,李肃义等编著.Java程序设计简明教程.北京:
中国水利水电出版社,2004.9
文件管理系统模拟
1.实验目的
通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现
2.实验内容
为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:
(1)可以实现下列几条命令(至少4条)
login用户登录
dir列文件目录
create创建文件
delete删除文件
open打开文件
close关闭文件
read读文件
write写文件
(2)列目录时要列出文件名、物理地址、保护码和文件长度;
(3)源文件可以进行读写保护。
3.实验提示
(1)首先应确定文件系统的数据结构:
主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
4.源代码
#include
#include
#include
#defineMEM_D_SIZE1024*1024//总磁盘空间为1M
#defineDISKSIZE1024//磁盘块的大小1K
#defineDISK_NUM1024//磁盘块数目1K
#defineFATSIZEDISK_NUM*sizeof(structfatitem)//FAT表大小
#defineROOT_DISK_NOFATSIZE/DISKSIZE+1//根目录起始盘块号
#defineROOT_DISK_SIZEsizeof(structdirect)//根目录大小
#defineDIR_MAXSIZE1024//路径最大长度为1KB
#defineMSD5//最大子目录数5
#defineMOFN5//最大文件深度为5
#defineMAX_WRITE1024*128//最大写入文字长度128KB
structfatitem/*size8*/
{
intitem;/*存放文件下一个磁盘的指针*/
charem_disk;/*磁盘块是否空闲标志位0空闲*/
};
structdirect
{
/*-----文件控制快信息-----*/
structFCB
{
charname[9];/*文件/目录名8位*/
charproperty;/*属性1位目录0位普通文件*/
intsize;/*文件/目录字节数、盘块数)*/
intfirstdisk;/*文件/目录起始盘块号*/
intnext;/*子目录起始盘块号*/
intsign;/*1是根目录0不是根目录*/
}directitem[MSD+2];
};
structopentable
{
structopenttableitem
{
charname[9];/*文件名*/
intfirstdisk;/*起始盘块号*/
intsize;/*文件的大小*/
}openitem[MOFN];
intcur_size;/*当前打文件的数目*/
};
structfatitem*fat;/*FAT表*/
structdirect*root;/*根目录*/
structdirect*cur_dir;/*当前目录*/
structopentableu_opentable;/*文件打开表*/
intfd=-1;/*文件打开表的序号*/
char*bufferdir;/*记录当前路径的名称*/
char*fdisk;/*虚拟磁盘起始地址*/
voidinitfile();
voidformat();
voidenter();
voidhalt();
intcreate(char*name);
intopen(char*name);
intclose(char*name);
intwrite(intfd,char*buf,intlen);
intread(intfd,char*buf);
intdel(char*name);
intmkdir(char*name);
intrmdir(char*name);
voiddir();
intcd(char*name);
voidprint();
voidshow();
voidinitfile()
{
fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申请1M空间*/
format();
}
voidformat()
{
inti;
FILE*fp;
fat=(structfatitem*)(fdisk+DISKSIZE);/*计算FAT表地址,引导区向后偏移1k)*/
/*-----初始化FAT表------------*/
fat[0].item=-1;/*引导块*/
fat[0].em_disk='1';
for(i=1;i{
fat[i].item=i+1;
fat[i].em_disk='1';
}
fat[ROOT_DISK_NO].item=-1;/*存放根目录的磁盘块号*/
fat[ROOT_DISK_NO].em_disk='1';
for(i=ROOT_DISK_NO+1;i{
fat[i].item=-1;
fat[i].em_disk='0';
}
/*-----------------------------------------------*/
root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);/*根目录的地址*/
/*初始化目录*/
/*---------指向当前目录的目录项---------*/
root->directitem[0].sign=1;
root->directitem[0].firstdisk=ROOT_DISK_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next=root->directitem[0].firstdisk;
root->directitem[0].property='1';
root->directitem[0].size=ROOT_DISK_SIZE;
/*-------指向上一级目录的目录项---------*/
root->directitem[1].sign=1;
root->directitem[1].firstdisk=ROOT_DISK_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next=root->directitem[0].firstdisk;
root->directitem[1].property='1';
root->directitem[1].size=ROOT_DISK_SIZE;
if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:
\nCannotopenfile\n");
return;
}
for(i=2;i{
root->directitem[i].sign=0;
root->directitem[i].firstdisk=-1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next=-1;
root->directitem[i].property='0';
root->directitem[i].size=0;
}
if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:
\nCannotopenfile\n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!
=1)/*把虚拟磁盘空间保存到磁盘文件中*/
{
printf("Error:
\nFilewriteerror!
\n");
}
fclose(fp);
}
voidenter()
{
FILE*fp;
inti;
fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申