操作系统课程设计Linux二级文件资料系统设计.docx
《操作系统课程设计Linux二级文件资料系统设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计Linux二级文件资料系统设计.docx(16页珍藏版)》请在冰豆网上搜索。
操作系统课程设计Linux二级文件资料系统设计
操作系统课程设计报告
专业:
软件工程
学号:
姓名:
马
提交日期:
2017/1/10
【设计目的】
1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现
2、结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统
3、通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力
【设计内容】
为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:
1.可以实现下列几条命令:
login用户登录
dir列目录
create创建文件
delete删除文件
open打开文件
close关闭文件
read读文件
write写文件
cd进出目录
2.列目录时要列出文件名,物理地址,保护码和文件长度
3.源文件可以进行读写保护
【实验环境】
C++
DevCpp
【设计思路】
本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:
主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:
file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
结构体:
typedefstruct/*thestructureofOSFILE*/
{
intfpaddr;/*filephysicaladdress*/
intflength;/*filelength*/
intfmode;/*filemode:
0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/
charfname[MAXNAME];/*filename*/
}OSFILE;//存放重要信息
typedefstruct/*thestructureofOSUFD*/
{
charufdname[MAXNAME];/*ufdname*/
OSFILEufdfile[MAXCHILD];/*ufdownfile*/
}OSUFD;//用户下面的文件
typedefstruct/*thestructureofOSUFD'LOGIN*/
{
charufdname[MAXNAME];/*ufdname*/
charufdpword[8];/*ufdpassword*/
}OSUFD_LOGIN;
typedefstruct/*fileopenmode*/
{
intifopen;/*ifopen:
0-close,1-open*/
intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/
}OSUFD_OPENMODE;
主要的函数说明:
voidLoginF();/*LOGINFileSystem用户登录*/
voidDirF();/*DirFileSystem列目录*/
voidCdF();/*ChangeDir改变目录*/
voidCreateF();/*CreateFile创建文件*/
voidDeleteF();/*DeleteFile删除文件*/
voidModifyFM();/*ModifyFileMode修改*/
voidOpenF();/*OpenFile打开文件*/
voidCloseF();/*CloseFile关闭文件*/
voidReadF();/*ReadFile读文件*/
voidWriteF();/*WriteFile写文件*/
voidQuitF();/*QuitFileSystem离开文件系统*/
voidhelp();
其他重要函数:
voidclrscr()//清屏
intExistD(char*dirname)/*WhetherDirNameExist,Exist-i,NotExist-0*/
intExistF(char*filename)/*WhetherFileNameExist,Exist-i,NotExist-0*/
intFindPANo()/*findoutphysicaladdressnum*/
voidSetPANo(intRorW)/*Setphysicaladdressnum,0-read,1-write*/
voidInputPW(char*password)/*inputpassword,use'*'replace*/
char*ltrim(char*str)/*removetheheadingblanks.去除左空白*/
char*rtrim(char*str)/*removethetrailingblanks.去除右空白*/
intWriteF1()/*writefile相当于置换文件*/
程序流程说明:
整体流程:
各部分功能流程:
Open:
NN
Y
Delete:
Y
N
N
Y
Y
N
Write:
N
Y
N
Y
1
0
Close:
N
Y
Y
N
【源程序清单】
Open:
voidOpenF()/*OpenFile*/
{
printf("\n\nC:
\\%s>",strupr(dirname));//显示当前路径
intfcoun,i;//定义两个整形变量
charfname[MAXNAME],fmode[25];//定义两个字符串变量
intfmod;//文件模式
printf("\nPleaseinputFileName:
");
gets(fname);//接收打开文件的文件名
ltrim(rtrim(fname));//去除左右空白
if(ExistF(fname)<0)//判断文件是否存在
{//不存在
printf("\nError.文件名\'%s\'不存在\n",fname);
wgetchar=1;
}else{//存在
i=ExistD(username);//获取用户物理信息
for(inta=0;a{
if(strcmp(fname,ufd[i]->ufdfile[a].fname)==0)//找到文件
{
fcoun=a;
break;
}
}
ifopen[i][fcoun].ifopen=1;//将文件状态置为打开状态
printf("PleaseinputOpenMode(0-ReadOnly,1-WriteOnly,2-ReadandWrite,3-Protect):
");//打开文件模式
gets(fmode);//获取模式
fmod=atoi(fmode);//将字符串转换为整型
ifopen[i][fcoun].openmode=fmod;//将文件的模式置为OpenMode
printf("\nOpenSuccessed");
wgetchar=1;
}
}
Delete:
voidDeleteF()/*DeleteFile*/
{
printf("\n\nC:
\\%s>",strupr(dirname));//显示路径
charfname[MAXNAME],str[50],str1[50];//定义三个字符串变量
inti,k,j;
intfpaddrno1;//记录文件物理地址块号
if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0){//判断主目录是否为空
printf("\nError.请确认您要删除的是否在用户目录下!
\n");
wgetchar=1;
}
if(strcmp(strupr(dirname),strupr(username))!
=0){//判断用户是否在用户目录下
printf("\nError.您只能删除修改自己用户目录下的文件哦!
\n");
wgetchar=1;
}else{
printf("\nPleaseinputFileName:
");
gets(fname);//接收删除的文件名
ltrim(rtrim(fname));//去除文件名的左右空白
i=ExistF(fname);//用户文件位置
if(i>=0){
k=ExistD(username);//获取用户所在存储位置
if(ifopen[k][i].ifopen==1){//文件状态处于打开状态,不许删除
printf("\nError.\'%s\'处于打开状态!
请先关闭哟!
\n",fname);
wgetchar=1;
}else{
if(ufd[k]->ufdfile[i].fmode==3){//保护文件,不可删除
printf("\nError.\'%s\'处于被保护状态!
请先关闭哟!
\n",fname);
wgetchar=1;
}else{
fpaddrno1=ufd[k]->ufdfile[i].fpaddr;//获取文件的物理地址块号
fpaddrno[fpaddrno1]=0;//回收物理地址块号
for(j=i;j{
ufd[k]->ufdfile[j]=ufd[k]->ufdfile[j+1];//将j+1位置为j
}
strcpy(str,"c:
\\osfile\\file\\");
itoa(fpaddrno1,str1,10);//将整数转化为字符串
strcat(str,str1);
strcat(str,".txt");//连接
remove(str);//删除物理文件
fcount[k--];//文件个数减一
printf("\n\'%s\'isdeletedsuccessfully.\n",fname);
wgetchar=1;
}
}
}else{
printf("\nError.\'%s\'文件不存在!
\n",fname);//文件不存在
wgetchar=1;
}
}
}
Write:
voidWriteF()/*WriteFile*/
{
printf("\n\nC:
\\%s>",strupr(dirname));//显示用户路径
inti,k,m=0;//定义整形变量
intlength;//定义长度整形变量
charfname[MAXNAME];//定义文件名字符串
charstr[255],str1[255];//定义两个字符串变量
if(strcmp(strupr(dirname),strupr(username))!
=0){//判断用户是否在用户目录下
printf("\nError!
请确认您要写的在用户目录下!
\n");
wgetchar=1;
return;
}
printf("\n请先打开文件!
\n");
printf("OpenedFile(s)List:
\n");
k=ExistD(dirname);//获取用户文件信息
for(i=0;i{
if(ifopen[k][i].ifopen==1){//文件处于打开状态
printf("%15s",ufd[k]->ufdfile[i].fname);
m++;
}
if(m%4==0&&m!
=0)//每创建4个文件换一行
printf("\n");
}
printf("\n%d文件已经打开啦!
\n",m);
if(m==0)
wgetchar=1;
if(m!
=0)//创建文件
{
printf("\nPleaseinputFileName:
");
gets(fname);//接收文件名
ltrim(rtrim(fname));//去除左右空白
i=ExistF(fname);//获取文件物理地址
if(i>=0){//文件存在
if(ifopen[k][i].ifopen==1){//文件处于打开状态
if(ifopen[k][i].openmode==1||ifopen[k][i].openmode==2){//文件权限是只写或读写
itoa(ufd[k]->ufdfile[i].fpaddr,str,10);//获取文件路径
strcpy(str1,"file");
strcat(str1,str);
strcpy(str,"c:
\\osfile\\file\\");
strcat(str,str1);
strcat(str,".txt");//文件路径
charstr2[3];
intchoice=3;
strcpy(str2,"ab");
printf("Youcanchoise[0-CoveredW][1-AdditonalW]:
");//选择追加还是覆盖
scanf("%d",&choice);
if(choice==0)//0-覆盖
strcpy(str2,"wb");
fp_file=fopen(str,str2);//打开文件
length=WriteF1();
ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+length;//修改文件长度
if(choice==0)
ufd[k]->ufdfile[i].flength=length;
printf("\n\nYouhavewritefilesuccessfully!
!
!
");
fclose(fp_file);//关闭文件
wgetchar=0;
}elseif(ifopen[k][i].openmode==0){//文件处于只读状态,不允许写
printf("\nError.\'%s\'文件以只读状态打开,不允许写!
\n",fname);
wgetchar=1;
}else{
printf("\nError.\'%s\'文件处于关闭状态,请先打开!
\n",fname);
wgetchar=1;
}
}
}else{
printf("\nError.\'%s\'文件不存在!
\n",fname);//文件不存在
wgetchar=1;
}
}
}
Close:
voidCloseF()/*CloseFile*/
{
printf("\n\nC:
\\%s>",strupr(dirname));//显示路径
charfname[MAXNAME];//定义字符串变量
inti,k,n=0;
if(strcmp(strupr(dirname),strupr(username))!
=0)//关闭用户文件需在用户目录下
{
printf("\nError!
请确认您要关闭的是在用户目录下!
\n");
}else{
printf("\n\nOpenedFile(s)List:
\n");//罗列已处于打开的文件
k=ExistD(dirname);
for(i=0;i{
if(ifopen[k][i].ifopen==1)//文件处于开启状态
if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))//只读或者读写状态
{
printf("%15s",ufd[k]->ufdfile[i].fname);
n++;
}
if((n%4==0)&&(n!
=0))printf("\n");
}
printf("\n%d文件已被打开!
\n",n);
if(n==0)wgetchar=1;
printf("\nPleaseinputFileName:
");
gets(fname);//接收关闭文件的文件名
ltrim(rtrim(fname));//除去首尾空格
i=ExistF(fname);//获取文件物理地址
if(i>=0)
{
k=ExistD(username);//获取用户文件信息
if(ifopen[k][i].ifopen==0)//文件处于关闭状态
{
printf("\nError!
\'%s\'文件已经被关闭!
\n",fname);
}else{//将文件关闭
ifopen[k][i].ifopen=0;
ifopen[k][i].openmode=4;
printf("\'%s\'hasbeenclosedsuccessfully!
",fname);
}
}else{
printf("\nError.\'%s\'文件不存在\n",fname);
}
}
}
【测试结果】
(此部分请同学们自己动手操作)
Login:
Help:
Create:
Open:
Read:
Write:
1—additional
添加后变为:
0—covered
覆盖后变为:
Close:
Attrib:
Delete:
Dir:
Cls:
(清屏)
Exit:
【设计总结】
首先通过这次的操作系统课程设计,让我认识到了实际的编程操作并不难,难的是对过程的设计,功能的定义以及最后的程序流程图的设计。
其次说一下我的认识,这次的课程设计使我对一些东西有了更加深刻的认知和了解,更重要的是巩固了新学的知识,以及对旧的知识进行了复习与了解,对一些细节方面的东西也有了更深刻的理解,所以这一次实践的机会,让我体会到了自己的不足之处,在以后的学习过程中,会加倍的认真努力。
让我对文件的操作更加熟练了,并且对Linux有了初步的了解。
其实这次课程设计,不能说很困难:
老师已经把大体的架构给我们了,我们需要添加的仅是四个功能的设计(open、write、delete、close)但是它又不是很容易,我们需要把整个的程序弄清,各个变量以及语句都要明白记住,这会关联到我们所定义的四个功能。
总算是把这次的课程设计搞定了,最让我开心的是课设完成之后看着自己的作品。
程序完整运行成功的那一瞬间最令我激动。
总之,这次的课设使我重新认识了不少,以后我会更加努力!
【参考文献】
计算机操作系统教程(第三版).张尧学史美林张高
计算机操作系统,西安电子科技大学出版社,方敏主编,2004.8