模拟UNIX文件系统.docx
《模拟UNIX文件系统.docx》由会员分享,可在线阅读,更多相关《模拟UNIX文件系统.docx(53页珍藏版)》请在冰点文库上搜索。
![模拟UNIX文件系统.docx](https://file1.bingdoc.com/fileroot1/2023-5/24/aac5d42d-bb7a-4bf9-a9e2-4f8a97b9be9b/aac5d42d-bb7a-4bf9-a9e2-4f8a97b9be9b1.gif)
模拟UNIX文件系统
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2013年秋季学期
操作系统原理课程设计
题目:
模拟UNIX文件系统
专业班级:
计算机科学与技术基地班
姓名:
关世伟
学号:
11250307
指导教师:
王旭阳
成绩:
目录
摘要2
正文3
1、问题描述3
2、算法思想3
3、各模块伪码算法4
4、函数调用关系图17
5、测试....................................................................................18
设计总结24
参考文献25
致 谢26
附录源程序27
摘要
本设计主要是针对模拟UNIX文件管理所做的,按照任务书的说明,在对针对UNIX文件系统设计中主要是通过C++对其功能进行描述,首先是对多用户的描述,对其用数组进行描述,在对其后的单用户登录login通过函数进行描述,这样提高了文件和数据的安全性可靠性,当输入的和用户名以及密码一致时进入系统进行操作,还有就是对文件的创建,打开,写,读,文件的删除,关闭,以及建立目录,改变当前目录,都是通过功能函数在其中实现其功能。
关键词:
多用户登录,文件的访问权限,目录设计,UNIX文件系统
正文
1.问题描述
该设计是针对UNIX系统所做的文件系统,其关键在于模拟,模拟文件操作的一些性质,及其应用。
利用WindowsSDK(SystemDevelopmentKit)提供的API(应用程序接口)编写程序实现文件系统的基本功能:
多用户:
usr1,usr2,usr3,……,
usr8(1-8个用户)、多级目录:
可有多级子目录、具有login(用户登录)、系统初始化(建文件卷、提供登录模块)、文件的创建:
create、文件的打开:
open、文件的读:
read、文件的写:
write、文件关闭:
close、删除文件:
delete、创建目录(建立子目录):
mkdir、改变当前目录:
cd、列出文件目录:
dir、退出:
logout。
首先系统要完成初始化的任务,建立起整个系统,等待用户登录使用文件系统,用户登录模块,对用户的用户名和密码进行验证(允许用户用限次的尝试),如果用户登录成功,显示“本文件系统文件目录”,其中有八个用户,从user1到user8。
我们可根据自己的需要选择用户。
选择以后,显示对每个文件的操作,其中有打开,读,写,关闭,删除,新建,注销用户,退出系统等目录显示。
可根据我们的具体需要选择我们所要的功能。
2.算法思想
模拟UNIX的文件系统的算法采用C++编写,其用两个结构体去表示多用户以及单用户的多文件的系统管理,然后对于文件的创建,打开,关闭,删除,创建子目录,改变当前目录等创建功能函数,最后在主函数里面再对磁盘进行初始化,开始运行程序功能,并采取UNIX的文件系统方法对其进行文件操作
3.各模块伪码算法
3.1创建结构体表示多用户以及单用户的多个文件
structFiles
{
stringfilename;////文件名
intf_Owner;////所有者(0~7)
stringr_time;////文件最后修改时间
intf_size;////文件大小
stringcont;////文件内容
Files*next;////指向下一个文件的指针
};
structFolder
{
intOwner;////所有者(0~7)
stringfoldername;////文件夹名字
stringm_time;////文件夹创建时间
Folder*folders;////存放文件夹指针
Files*file;////存放文件指针
Folder*fparent;////指向路径父节点的指针
Folder*next;////指向同一层下一文件夹的指针
};
3.2时间函数用于表示文件的创建时间
char*Time()
{
time_ttm;
tm=time(0);
char*t;
t=ctime(&tm);
returnt;
}
3.3创建目录
voidMkdir(Folder*&Target,string&Name,intUnum)
{
Folder*pd=Target->folders;
while(pd!
=NULL)
{
if(pd->foldername==Name)
{
cout<<"子目录"<"<return;
}
pd=pd->next;
}
Folder*md=newFolder;
md->file=NULL;
md->m_time=Time();
md->foldername=Name;
md->folders=NULL;
md->fparent=Target;
md->next=NULL;
md->Owner=Unum;
if(Target->folders==NULL)
{
Target->folders=md;
}
else
{
pd=Target->folders;
while(pd->next!
=NULL)
{
pd=pd->next;
}
pd->next=md;
}
md=NULL;
return;
}
3.4改变当前目录
voidCd(Folder*list,Folder*&Target,string&Name,string&path)
{
if(Name=="C"||Name=="D"||Name=="E"||Name=="c"||Name=="d"||Name=="e")
{
if(Name=="C"||Name=="c")
{
Target=list;
path="C:
\\>";
return;
}
if(Name=="D"||Name=="d")
{
Target=list->next;
path="D:
\\>";
return;
}
if(Name=="E"||Name=="e")
{
Target=list->next->next;
path="E:
\\>";
return;
}
}
if(".."==Name)
{
if(Target->fparent==NULL)
{
cout<<"此目录已经为根目录!
"<return;
}
else
{
intn=Target->foldername.size()+2;
path=path.substr(0,path.size()-n);
path+=">";
Target=Target->fparent;
return;
}
}
else
{
Folder*pcd=Target->folders;
if(pcd==NULL)
{
cout<<"系统找不到指定的路径"<return;
}
do
{
if(pcd->foldername==Name)
{
Target=pcd;
intn=path.find(">");
stringpname=Name+"\\";
path.insert(n,pname);
return;
}
else
{
pcd=pcd->next;
}
}while(pcd!
=NULL);
cout<<"系统找不到指定的路径"<}
return;
}
voidDir(Folder*&Target)//列出文件目录
{
if((Target->folders==NULL)&&(Target->file==NULL))
{
cout<<"文件夹为空"<return;
}
else
{
Folder*pdir=NULL;
Files*pfdir=NULL;
if(Target->folders!
=NULL)
{
pdir=Target->folders;
do
{
for(inti=0;i<(pdir->m_time.size()-1);i++)
{
cout<m_time[i];
}
cout<<""<<"
"<<'\t'<<"User"<Owner<<'\t'<foldername<pdir=pdir->next;
}while(pdir!
=NULL);
cout<}
if(NULL!
=Target->file)
{
pfdir=Target->file;
do
{
for(intf=0;f<(pfdir->r_time.size()-1);f++)
{
cout<r_time[f];
}
cout<<""<<""<<'\t'<<"User"<f_Owner<<'\t'<filename<<'\t'<<'\t'<<"size:
"<f_size<pfdir=pfdir->next;
}while(pfdir!
=NULL);
}
}
return;
}
3.5文件的创建
voidCreate(Folder*&Target,string&Name,intUnum)
{
Files*fp=Target->file;
Files*pdfp=NULL;
while(fp!
=NULL)
{
if(fp->filename==Name)
{
cout<<"文件"<"<return;
}
pdfp=fp;
fp=fp->next;
}
Files*cf=newFiles;
cf->f_Owner=Unum;
cf->f_size=cf->cont.size();
cf->filename=Name;
cf->next=NULL;
cf->r_time=Time();
if(Target->file==fp)
{
Target->file=cf;
}
else
{
pdfp->next=cf;
}
return;
}
Files*Open(Folder*&Target,string&Name)/*文件的打开*/
{
Files*fp=Target->file;
BOOLstate=FALSE;
while(fp!
=NULL)
{
if(fp->filename==Name)
{
state=TRUE;
break;
}
fp=fp->next;
}
if(state==FALSE)
{
cout<<"没有找到路径文件"<"<}
returnfp;
}
voidRead(Folder*&Target,string&Name)/*文件的读*/
{
Files*pr=Open(Target,Name);
if(pr!
=NULL)
{
if((pr->cont.size())==0)
{
cout<<"文件内容为空!
"<return;
}
else
{
for(intn=0;n<=pr->cont.size();n++)
{
cout<cont[n];
Sleep(50);
}
cout<cout<}
}
else
{
cout<<'\a'<<"非法操作!
"<}
}
voidWrite(Folder*&Target,string&Name,intUnum)/*文件的写*/
{
Files*pw=Open(Target,Name);
if(pw!
=NULL)
{
if(pw->f_Owner==Unum)
{
cout<<"输入文本,请以\"%\"结束输入!
"<getline(cin,pw->cont,'%');
pw->r_time=Time();
pw->f_size=pw->cont.size();
}
else
{
cout<<"警告:
用户没有权限执行当前操作!
"<return;
}
}
else
{
cout<<'\a'<<"非法操作!
"<}
return;
}
3.6文件关闭
voidClose(Folder*&Target,string&Name)
{
cout<<"关闭文件"<"<return;
}
3.7文件的删除
voidDelete(Folder*&Target,string&Name,intUnum)/*删除文件*/
{
Files*pfd=NULL;
Files*pre=NULL;
boolf_state=false;
if(Target->file==NULL)
{
cout<<"找不到所要删除的目录!
"<return;
}
else
{
pfd=Target->file;
pre=Target->file;
do
{
if(pfd->filename==Name)
{
f_state=true;
break;
}
pre=pfd;
pfd=pfd->next;
}while(pfd!
=NULL);
}
if(f_state)
{
if(pfd->f_Owner==Unum)
{
charok;
cout<<"删除"<filename<<","<<"是否确认?
";
cin>>ok;
if(ok=='Y'||ok=='y')
{
if(Target->file==pre)
{
Target->file=pfd->next;
deletepfd;
pfd=NULL;
return;
}
else
{
if(pfd->next!
=NULL)
{
pre->next=pfd->next;
deletepfd;
pfd=NULL;
}
if(pfd==NULL)
{
pre->next=NULL;
}
}
}
}
else
{
cout<<"警告:
用户没有权限执行当前操作!
"<return;
}
}
else
{
cout<<"找不到所要删除的文件!
"<}
return;
}
3.8休眠函数
voidchange()
{
for(inta=0;a<4;a++)
{
Sleep(500);
cout<<'.';
}
}
3.9退出函数
voidlogout()/*退出*/
{
cout<cout<change();
system("cls");
}
4.函数调用关系图
4.1用户选择函数如图所示
4.2程序执行基本流程
5.测试
5.1欢迎界面
5.2用户选择界面
5.3用户登录界面
5.4帮助界面
5.5创建目录
5.6创建并显示文件
5.7创建另一个目录并创建文件
5.8写文件
5.9读文件
5.10显示当前目录和文件
5.11在当前目录下创建新目录并创建文件进行读写操作
5.12错误操作
5.13显示子目录下的文件
5.14退出当前操作
设计总结
本次的操作系统课程设计是对自己的一个提高,自己分配的题目是模拟UNIX文件系统,刚开始自己对这个茫然无知,但是自己经过去图书馆查询资料借书自己看,慢慢的对UNIX系统有了初步的了解,同时对自己的课设任务也有了一定的认识,慢慢的觉得自己也可以做这个了。
本学期的操作系统让我对计算机的软件基础有了初步的认识,模拟UNIX文件系统也是基于操作系统的所做的一个方面的事情,要求是对于多用户进行的文件管理,对于文件要进行一般的操作比如创建,打开,读写操作,以及目录的建立和改变当前目录,通过对UNIX系统的了解,我选择了C++来设计改程序,在编写源代码的过程中,自己过对于目录的创建,还有对当前目录的修改方面还是很是不理解,但是经过自己在网上查询资料,再看别人写的源程序关于这两个方面的描述,自己在一段时间内将源程序写出,并经过修改终于实现了所要求的功能,而后自己参考别人的源代码,将自己的程序设计的更加合理化,加上时间方面的处理,使之在文件创建的时候记录创建时间,并在最后查看的时候显示时间,并且对于开始界面和结束界面也做了一定的处理。
经过本次的课程设计,自己对于操作系统中的文件管理方面的认识更加的深刻,尤其是在对文件的处理方面自己做的更是得心应手了,而且自己查了很多的资料,完善了自己在这方面的不足,增强了自主学习的能力,我相信,下次自己能做的更好!
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等.操作系统教程.高等教育出版社
4.曾明. Linux操作系统应用教程.陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.
6.孟静, 操作系统教程--原理和实例分析.高等教育出版社
7.周长林,计算机操作系统教程.高等教育出版社
8.张尧学,计算机操作系统教程,清华大学出版社
致谢
本次的课程设计过程中,自己存在很多的问题在自身的努力下并没有得到很好地解决,多亏了周围同学们对自己的帮助,以及老师对自己的指点,才能使自己在很短的时间内完成自己的任务,在此深深地感谢他们,你们辛苦了!
附录源程序:
#include
#include
#include
#include
#include
#include
#defineFOLDER
usingnamespacestd;
structFiles
{
stringfilename;////文件名
intf_Owner;////所有者(0~7)
stringr_time;////文件最后修改时间
intf_size;////文件大小
stringcont;////文件内容
Files*next;////指向下一个文件的指针
};
structFolder
{
intOwner;////所有者(0~7)
stringfoldername;////文件夹名字
stringm_time;////文件夹创建时间
Folder*folders;////存放文件夹指针
Files*file;////存放文件指针
Folder*fparent;////指向路径父节点的指针
Folder*next;////指向同一层下一文件夹的指针
};
//多用户:
usr1,usr2,usr3,……,usr8(1-8个用户)、多级目录:
可有多级子目录、具有login(用户登录)、
//系统初始化(建文件卷、提供登录模块)、文件的创建:
create、文件的打开:
open、文件的读:
read、文件的写:
write、
//文件关闭:
close、删除文件:
delete、创建目录(建立子目录):
mkdir、改变当前目录:
cd、列出文件目录:
dir、退出:
logout。
stringUserName[8]={"billjames","user1","user2","user3","user4","user5","user6","user7"};
stringPassWord[8]={"12345","12345","12345","12345","12345","12345","12345","12345"};
stringconstMethods[11]={"create","open","read","write","close","fdelete","mkdir","cd","dir","help","logout"};
char*Time()
{
time_ttm;
tm=time(0);
char*t;
t=ctime(&tm);
returnt;
}
voidMkdir(Folder*