操作系统课程设计Linux二级文件资料系统设计.docx
- 文档编号:3408120
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:16
- 大小:162.35KB
操作系统课程设计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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 Linux 二级 文件 资料 系统 设计