实验六模拟文件系统.docx
《实验六模拟文件系统.docx》由会员分享,可在线阅读,更多相关《实验六模拟文件系统.docx(13页珍藏版)》请在冰点文库上搜索。
实验六模拟文件系统
实验六模拟文件系统
操作系统试验
班级:
计科0801姓名:
韩伟伟学号:
08407106日期:
2011/6/15
实验六模拟实现文件系统
一.实验目的
通过模拟程序实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能,了解文件系统实现的特点,掌握文件系统的各种功能实现方法。
二.实验属性
设计
三.实验内容
模拟实现文件系统问题是一个经典的关于文件的处理问题,包括:
实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能。
设计思想如下:
1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2.文件物理结构可采用显式链接或其他方法。
3.磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。
5.设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:
(1)具有login(用户登录)
(2)系统初始化(建文件卷、提供登录模块)
(3)文件的创建:
create
(4)文件的打开:
open
(5)文件的读:
read
(6)文件的写:
write
(7)文件关闭:
close
(8)删除文件:
delete
(9)列出文件目录:
dir
(10)退出:
logout
四.设计思路
1.本系统初始化了十个用户,每个用户初始化五个文件,最多可拥有十个文件,所以每个用户在此基础上可为自己再创建五个文件,也可以在删除文件后再创建。
2.系统使用create,open,read,write,close,delete,dir和exit来创建文件,打开文件,读文件,写文件,关闭文件,删除文件和显示文件。
3.程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
4.为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
模拟实现文件系统的主要流程图如下:
#defineUserOFNumber5
structfname{
charfnamea[1];
intflag;
}fnameA[26]={'a',0,'b',0,'c',0,'d',0,'e',0,'f',0,'g',0,'h',0,'i',0,'j',0,'k',0,'l',0,
'm',0,'n',0,'o',0,'p',0,'q',0,'r',0,'s',0,'t',0,'u',0,'v',0,'w',0,'x',0,'y',0,'z',0};
structafd{
charopname[10];/*打开文件名*/
intflag;
charopfprotect[3];/*打开保护码*/
intrwpoint;/*读写指针*/
}AFD[UserOFNumber];/*用户打开的文件*/
typedefstruct{
charfname[10];/*用户文件名*/
intflag;/*文件存在标志*/
intfprotect[3];/*文件保护码r\w\t*/
intflength;
}ufd,UF[UserFNumber];/*用户文件*/
structmdf{
charuname[10];/*用户名*/
UFUdir;/*用户文件目录*/
}UFD[UserNumber];/*用户*/
voidintFSystem(){
inti,j,k,l;
strcpy(UFD[0].uname,"a");
strcpy(UFD[1].uname,"b");
strcpy(UFD[2].uname,"c");
strcpy(UFD[3].uname,"d");
strcpy(UFD[4].uname,"e");
strcpy(UFD[5].uname,"f");
strcpy(UFD[6].uname,"g");
strcpy(UFD[7].uname,"h");
strcpy(UFD[8].uname,"i");
strcpy(UFD[9].uname,"j");
for(i=0;i<10;i++){
for(k=0;k<5;k++){
doj=rand()%26;while(fnameA[j].flag);
strcpy(UFD[i].Udir[k].fname,fnameA[j].fnamea);
fnameA[j].flag=1;
UFD[i].Udir[k].flength=rand()%2048+1;
UFD[i].Udir[k].flag=1;
UFD[i].Udir[k].fprotect[0]=rand()%2;
UFD[i].Udir[k].fprotect[1]=rand()%2;
UFD[i].Udir[k].fprotect[2]=rand()%2;
}
for(j=0;j<26;j++)fnameA[j].flag=0;
}
for(l=0;l<5;l++){
strcpy(AFD[i].opname,"");
AFD[l].flag=0;
AFD[l].opfprotect[0]=0;
AFD[l].opfprotect[1]=0;
AFD[l].opfprotect[2]=0;
AFD[l].rwpoint=0;
}
}
voidOpen(inti){intl,k,n;
charfile[10];
for(l=0;l<5;l++){if(!
AFD[l].flag)break;}
printf("请输入你想打开的文件名:
");
scanf("%s",file);
for(n=0;n<5;n++)if(!
strcmp(AFD[n].opname,file)&&AFD[n].flag)
{printf("hefilehadopened!
\n",file);return;}
for(k=0;k<10;k++)if(!
strcmp(UFD[i].Udir[k].fname,file)&&UFD[i].Udir[k].flag)
{strcpy(AFD[l].opname,UFD[i].Udir[k].fname);AFD[l].opfprotect[0]=UFD[i].Udir[k].fprotect[0];
AFD[l].opfprotect[1]=UFD[i].Udir[k].fprotect[1];
AFD[l].opfprotect[2]=UFD[i].Udir[k].fprotect[2];
AFD[l].flag=1;
printf("文件已打开!
\n");
return;}
printf("文件不存在!
\n");
return;
}
voidCreate(inti){intk;
for(k=0;k<10;k++){if(!
UFD[i].Udir[k].flag)break;}
if(k>=10){printf("一个用户不能拥有超过10个文件\n\n");return;}
printf("请输入你想创建的文件名:
");
scanf("%s",UFD[i].Udir[k].fname);
printf("请输入文件长度:
");
scanf("%d",&UFD[i].Udir[k].flength);
printf("只读?
(1yes,0no):
");
scanf("%d",&UFD[i].Udir[k].fprotect[0]);
printf("可写?
(1yes,0no):
");
scanf("%d",&UFD[i].Udir[k].fprotect[1]);
printf("可执行?
(1yes,0no):
");
scanf("%d",&UFD[i].Udir[k].fprotect[2]);
UFD[i].Udir[k].flag=1;
return;}
voidDelete(inti){charfile[10];intk;
printf("请输入你想删除的文件名:
");
scanf("%s",file);
for(k=0;k<10;k++){
if(UFD[i].Udir[k].flag&&!
strcmp(UFD[i].Udir[k].fname,file))
{
printf("文件已删除!
\n");
UFD[i].Udir[k].flag=0;break;}
elseif(!
UFD[i].Udir[k].flag&&!
strcmp(UFD[i].Udir[k].fname,file))
printf("文件不存在!
\n");
}
return;}
voidRead(){intl;charfile[10];
printf("请输入你想读的文件:
");
scanf("%s",file);
for(l=0;l<5;l++)if(!
strcmp(AFD[l].opname,file)&&AFD[l].flag)
if(AFD[l].opfprotect[0]){printf("thefilehasread.\n");return;}else{printf("cannotread!
\n");return;}
if(l>=5)printf("文件尚未打开,请先打开文件\n");
return;}
voidWrite(){
intl;charfile[10];
printf("请输入你想写的文件:
");
scanf("%s",file);
for(l=0;l<5;l++)if(!
strcmp(AFD[l].opname,file)&&AFD[l].flag)
if(AFD[l].opfprotect[1]){printf("thefilehaswritten.\n");return;}else{printf("cannotwrite!
\n");return;}
if(l>=5)printf("文件尚未打开,请先打开文件\n");
return;}
voidprintUFD(inti){intk;
printf("主文件目录:
\n",UFD[i].uname);
printf("用户名\t文件名\t可读可写可执行\t文件长度\n");
for(k=0;k<10;k++){
if(UFD[i].Udir[k].flag)
printf("%s\t%s\t%d%d%d\t\t%dB\n",UFD[i].uname,UFD[i].Udir[k].fname,UFD[i].Udir[k].fprotect[0],
UFD[i].Udir[k].fprotect[1],UFD[i].Udir[k].fprotect[2],UFD[i].Udir[k].flength);
}
}
voidprintAFD(inti){intl,k;
if(!
AFD[0].flag&&!
AFD[1].flag&&!
AFD[2].flag&&!
AFD[3].flag&&!
AFD[4].flag)
{
printf("当前没有运行的文件!
\n");
return;
}
else
{
printf("运行文件目录:
\n");
printf("文件名\t可读可写可执行\n");
for(l=0;l<5;l++)
{
for(k=0;k<10;k++)
{
if(!
strcmp(UFD[i].Udir[k].fname,AFD[l].opname)&&UFD[i].Udir[k].flag&&AFD[l].flag){break;}
elsecontinue;
}
if(!
strcmp(UFD[i].Udir[k].fname,AFD[l].opname)&&UFD[i].Udir[k].flag&&AFD[l].flag){printf("%s\t%d%d%d\n",AFD[l].opname,AFD[l].opfprotect[0],AFD[l].opfprotect[1],AFD[l].opfprotect[2]);}
}
}
}
voidClose(){intl;
charfile[10];
printf("请选择文件:
");
scanf("%s",file);
for(l=0;l<5;l++)
if(!
strcmp(AFD[l].opname,file)&&AFD[l].flag){AFD[l].flag=0;printf("thefilehasclose\n");return;}
if(l>=5)printf("文件打开失败!
\n");
return;}
voidmain(){inti,n=0;
charm[10];
charlogin[10];
intFSystem();
printf("欢迎使用\n");
printf("1.本系统模拟文件管理2.系统已初始化10个用户,\n用户名分别是a~j,每个用户已分配五个文件\n");
printf("**本系统的命令包括如下:
\n");
printf("**创建文件(create)\n");
printf("**删除文件(delete)\n");
printf("**打开文件(open)\n");
printf("**关闭文件(close)\n");
printf("**读取文件(read)\n");
printf("**编写文件(write)\n");
printf("**显示文件目录(printufd)\n");
printf("**显示打开文件目录(dir)\n");
printf("**退出(exit)\n");
lgin:
printf("请输入用户名(a~j):
");
scanf("%s",login);
if(!
strcmp(login,"exit"))return;
for(i=0;i<10;i++){if(!
strcmp(UFD[i].uname,login))break;}
if(i>=10){printf("该用户名不存在!
");gotolgin;}
printUFD(i);
for(;n!
=1;){
printf("请输入命令:
");
scanf("%s",&m);
if(strcmp(m,"create")==0)Create(i);
elseif(strcmp(m,"delete")==0)Delete(i);
elseif(strcmp(m,"open")==0)Open(i);
elseif(strcmp(m,"close")==0)Close();
elseif(strcmp(m,"read")==0)Read();
elseif(strcmp(m,"write")==0)Write();
elseif(strcmp(m,"printufd")==0)printUFD(i);
elseif(strcmp(m,"dir")==0)printAFD(i);
elseif(strcmp(m,"exit")==0)n=1;
elseprintf("出错\n");
}
printf("Saving....\n");
printUFD(i);
getch();
return;
}
用户登录时的界面如下:
用户对此模拟系统进行各项操作的界面如下:
2.描述文件系统的实现原理
本系统是模拟实现多用户多目录的文件系统(10个用户),在系统出现登录后,输入用户名,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指定的文件中。
系统的命令与其命令的具体实现,此模拟系统共提供了9条基本命令,并根据命令的含义与要求,用C++编程来完成所有具体操作。
该系统可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能。
3.总结体会
通过本次试验使我对文件系统的理解更深了一个层次,全面了解了计算机是如何管理文件的。
另一方面,通过对文件系统的设计也使我对C++的编程能力有了提高。