操作系统课程设计Linux二级文件资料系统设计.docx

上传人:b****6 文档编号:3408120 上传时间:2022-11-22 格式:DOCX 页数:16 大小:162.35KB
下载 相关 举报
操作系统课程设计Linux二级文件资料系统设计.docx_第1页
第1页 / 共16页
操作系统课程设计Linux二级文件资料系统设计.docx_第2页
第2页 / 共16页
操作系统课程设计Linux二级文件资料系统设计.docx_第3页
第3页 / 共16页
操作系统课程设计Linux二级文件资料系统设计.docx_第4页
第4页 / 共16页
操作系统课程设计Linux二级文件资料系统设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

操作系统课程设计Linux二级文件资料系统设计.docx

《操作系统课程设计Linux二级文件资料系统设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计Linux二级文件资料系统设计.docx(16页珍藏版)》请在冰豆网上搜索。

操作系统课程设计Linux二级文件资料系统设计.docx

操作系统课程设计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

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 专升本

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1