文件系统课程设计报告.docx

上传人:b****1 文档编号:2672675 上传时间:2023-05-04 格式:DOCX 页数:43 大小:366.90KB
下载 相关 举报
文件系统课程设计报告.docx_第1页
第1页 / 共43页
文件系统课程设计报告.docx_第2页
第2页 / 共43页
文件系统课程设计报告.docx_第3页
第3页 / 共43页
文件系统课程设计报告.docx_第4页
第4页 / 共43页
文件系统课程设计报告.docx_第5页
第5页 / 共43页
文件系统课程设计报告.docx_第6页
第6页 / 共43页
文件系统课程设计报告.docx_第7页
第7页 / 共43页
文件系统课程设计报告.docx_第8页
第8页 / 共43页
文件系统课程设计报告.docx_第9页
第9页 / 共43页
文件系统课程设计报告.docx_第10页
第10页 / 共43页
文件系统课程设计报告.docx_第11页
第11页 / 共43页
文件系统课程设计报告.docx_第12页
第12页 / 共43页
文件系统课程设计报告.docx_第13页
第13页 / 共43页
文件系统课程设计报告.docx_第14页
第14页 / 共43页
文件系统课程设计报告.docx_第15页
第15页 / 共43页
文件系统课程设计报告.docx_第16页
第16页 / 共43页
文件系统课程设计报告.docx_第17页
第17页 / 共43页
文件系统课程设计报告.docx_第18页
第18页 / 共43页
文件系统课程设计报告.docx_第19页
第19页 / 共43页
文件系统课程设计报告.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

文件系统课程设计报告.docx

《文件系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《文件系统课程设计报告.docx(43页珍藏版)》请在冰点文库上搜索。

文件系统课程设计报告.docx

文件系统课程设计报告

 

操作系统课程设计报告

 

题目:

文件系统

专业:

软件工程

院系:

信息管理学院

年级:

大三软件Q1141

学号:

11150132

姓名:

王毅

指导教师:

李红艳

职称:

副教授

 

湖北经济学院教务处制

 

操作系统课程设计报告

一实验内容……………………………………………………………….2

二设计的基本概念和原理……………………………………………….2

三总体设计……………………………………………………………….2

2-1文件的组织结构.........................................................................................2

2-2磁盘空间的管理.........................................................................................2

2-3目录结构………………………………………………………………….3

2-4文件操作………………………………………………………………......4

四详细设计……………………………………………………………….4

4-1建立文件(create_file)流程图…………………………………………4

4-2打开文件(open_file)流程图…………………………………………..6

4-3读文件(read_file)流程图……………………………………………....7

4-4写文件(write_file)流程图……………………………………………..8

4-5关闭文件(close_file)流程图…………………………………………..9

4-6删除文件(delete_file)流程图………………………………………….10

4-7显示文件内容(typefile)流程图………………………………………..11

4-8建立目录(md)流程图…………………………………………………..12

4-9显示目录内容流程图…………………………………………………....13

五详细代码……………………………………………………………...14

六运行结果截图………………………………………………………...40

七总结…………………………………………………………………...44

八参考文献……………………………………………………………...45

 

一、实验内容

要求设计一个简单的文件系统,用文件模拟磁盘,实现以下功能:

(1)支持多级目录结构;

(2)实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性。

(3)编写主函数对所有操作进行测试

二、设计的基本概念和原理

为了正确地实现文件的存取,文件系统设计了一组与存取文件有关的功能模块,

用户可以用“访问指令”调用这些功能模块,以实现文件的存取要求。

我们把文件系统设计的这一组功能模块称为“文件操作“,实验就是要模拟实现一些文件操作。

文件操作不是独立的,它和文件系统的其他部分密切相关,若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。

因此,这个实习虽然是文件操作的模拟实现,但还是必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。

三、总体设计

(1)文件的组织结构:

文件的逻辑结构有两种形式:

流式文件和记录文件。

实验中只支持流式文件,采用称为显示链接的物理文件结构,把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)

磁盘有多少块,文件分配表就有多少项,若某文件的一个磁盘块号为i,则这个文件的下一个磁盘的块号应该记录在文件分配表第i项,例如某系统文件分配表的前几项如下图所示,某个文件的起始盘块号为3,则该文件的磁盘块号依次为:

3、4、9、12、13

第几项

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

……

内容

-1

-1

-1

4

9

0

7

8

-1

12

11

-1

13

-1

0

0

……

(2)磁盘空间的管理:

首先要模拟一个磁盘,因为是实验,不用使用真正的磁盘,所以实验中用一个文件模拟一个小磁盘。

假设模拟磁盘有128个物理块,每个物理块大小为64个字节,盘块的块号从0编起,0,1,2,3……,127。

将文件分配表放在磁盘的开始处,因为盘块邮128块,所以文件分配表有128项,每项占用一个字节,这样文件分配表占用了磁盘的0块和1块,这两块不能作其他用

处,若一个盘块是某个文件的最后一块,填写“-1”表示文件结束,本实验中用0表示磁盘盘块空闲,非0表示盘块占用,用255代替-1表示文件结束,254表示盘块损坏。

 

分配一个磁盘块的流程图

(3)目录结构:

文件目录是用于检索文件的,它是文件系统实现按名存取的主要手段。

文件目录由若干目录组成,每一个目录记录一个文件的有关信息:

有关文件的控制信息。

模拟文件操作这部分仅包括文件名、文件类型和属性。

有关文件结构的信息。

模拟文件操作这部分仅包括文件在存储介质的位置(分给文件第一个盘块的块号,即起始盘块号)、文件的长度;

有关文件管理的信息

文件名:

3个字节(实验中合法文件名仅仅、可以使用字母、数字和除“$”,“.”,“/”以外的字符,第一个字节的值为“$”时表示该目录为空目录项,文件名和类型名之间用“.”分隔,用“/”作为路径名中目录间分隔符)

(4)文件操作:

确定文件组织结构、目录结构和磁盘空间管理的方法后,就可以模拟文件操作的实现。

实验中文件操作包括建立文件(create_file),打开文件(open_file),关闭文件(close_file),读文件(read_file),写文件(write_file),删除文件(delete_file)

,显示文件内容(typefile)和改变文件属性(change),目录命名包括建立目录(md),显示目录类容(dir)和删除空目录(rd),在实验室中没有程序调用这些指令,为了看到它们的模拟情况,从键盘输入选择指令来模拟用户程序的调用,首先要建立一个“已打开文件表”,用来记录打开或建立文件的相关内容,结构图如下

文件路径名

文件属性

起始盘块号

文件长度

操作类型

读指针

写指针

块号

块内地址

块号

块内地址

……

……

……

……

……

四、详细设计

(1)建立文件:

create_file(文件名,文件属性)

(2)打开文件open_file(文件名,操作类型),以下为打开文件的流程图

 

(3)读文件read_file(文件名,读取长度)

(4)写文件write_file(文件名,缓冲,写长度)

(5)关闭文件close_file(文件名)

 

(6)删除文件delete_file(文件名)

 

(7)显示文件内容(typefile)

 

(8)目录操作命令:

建立目录(md)

(9)显示目录内容(rd)

 

五、详细代码

intsopen(char*name)//在已打开的文件表中查找文件name

{

inti;

i=0;

while(i

=0)//依次查找已打开文件表

{

i++;

}

if(i>=openfile.length)

{

return-1;

}

returni;

}

voiddopen(char*name)//在已打开文件表中删除文件name

{

inti;

i=sopen(name);

if(i==-1)

{

printf("文件未打开\n");

}

else

{

copy(&openfile.file[i],&openfile.file[openfile.length-1]);

openfile.length--;

}

}

intiopen(ofile*x)//向已打开文件列表中插入文件x->name

{

inti;

i=sopen(x->name);

if(i!

=-1)

{

printf("文件已经打开\n");

returnfalse;

}

elseif(openfile.length==n)

{

printf("已打开文件表已满");

returnfalse;

}

else

{

copy(&openfile.file[openfile.length],x);

openfile.length++;

returntrue;

}

}

intallocate()//分配一个磁盘块,返回块号

{

inti;

fseek(fc,0,SEEK_SET);//将模拟磁盘的文件指针移至模拟磁盘FAT表

fread(buffer1,64L,1,fc);

for(i=3;i<63;i++)

{

if(buffer1[i]==0)//FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘

{

buffer1[i]=255;

fseek(fc,0,SEEK_SET);

fwrite(buffer1,64L,1,fc);

returni;//返回磁盘号

}

}

fread(buffer1,64L,1,fc);//将FAT表中第二个磁盘块读入模拟缓冲buffer1

for(i=0;i<63;i++)

{

if(buffer1[i]==0)//AT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写回磁盘

{

buffer1[i]=255;

fseek(fc,-64L,SEEK_CUR);

fwrite(buffer1,64L,1,fc);

returni+64;//返回磁盘号

}

}

printf("已经没有磁盘空间\n");

returnfalse;

}

intread_file(char*name,intlength)//读取文件,文件名为name,读取长度为length

{

inti,t;

charch;

if((i=sopen(name))==-1)

{

printf("文件未打开或不存在\n");

returnfalse;

}

if(openfile.file[i].flag==1)

{

printf("文件以写方式打开,不能读\n");

returnfalse;

}

t=0;

fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);

fread(buffer1,64,1,fc);

while(t

='#')

{

putchar(buffer1[openfile.file[i].read.bnum]);//读出一个字符显示在屏幕上

if((t+1)%64==0)

{

putchar('\n');

}

openfile.file[i].read.bnum++;//修改读指针

if(openfile.file[i].read.bnum>=64)//一块读完,读取下一块

{

fseek(fc,openfile.file[i].read.dnum/64*64,SEEK_SET);

fread(buffer1,64,1,fc);

openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64];

openfile.file[i].read.bnum=0;//修改读指针

fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);

fread(buffer1,64,1,fc);

}

t++;

}

}

intwrite_file(char*name,char*buff,intlength)

//name文件路径名

//buff存放准备写入磁盘的内容

//length写入内容的长度

{

inti,t,dd;

if((i=sopen(name))==-1)

{

printf("文件未打开或不存在\n");

returnfalse;

}

if(openfile.file[i].flag==0)

{

printf("文件以只读方式打开,不能写\n");

returnfalse;

}

t=0;

fseek(fc,openfile.file[i].write.dnum*64L,SEEK_SET);

fread(buffer1,64,1,fc);

while(t

{

buffer1[openfile.file[i].write.bnum]=buff[t];

openfile.file[i].write.bnum++;

openfile.file[i].length++;

if(openfile.file[i].write.bnum>=64)

{

fseek(fc,openfile.file[i].write.dnum*64L,SEEK_SET);

fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/

if((dd=allocate())==false)

{

openfile.file[i].write.bnum--;

openfile.file[i].length--;

printf("无磁盘空间,部分信息丢失,写失败\n");

return(false);

}

fseek(fc,openfile.file[i].write.dnum/64*64L,SEEK_SET);

fread(buffer1,64,1,fc);

buffer1[openfile.file[i].write.dnum%64]=dd;

fseek(fc,openfile.file[i].write.dnum/64*64L,SEEK_SET);

fwrite(buffer1,64,1,fc);

openfile.file[i].write.dnum=dd;

openfile.file[i].write.bnum=0;

}

t++;

}

fseek(fc,openfile.file[i].write.dnum*64L,SEEK_SET);

fwrite(buffer1,64,1,fc);//一块写完,写回磁盘//

}/*写函数结束*/

intsearch(char*name,intflag,int*dnum,int*bnum)

//查找路径名为name的文件或目录,返回该目录的起始盘块号

//flag=8表示查找目录,否则为文件

//dnum,bnum返回文件或目录的目录项登记位置,盘块dnum中第bnum项

{

intk,i,s,t,j,last=0;

charpna[3],type[2];

if(strcmp(name,"")==0||strcmp(name,"/")==0)//根目录

return2;

k=0;

if(name[0]=='/')k=1;

i=2;//i为根目录的起始盘号

while(last!

=1)//pna为从name中分离出"/"后一个目录名或文件名

{

for(s=0;name[k]!

='.'&&name[k]!

='/'&&s<3&&name[k]!

='\0';s++,k++)

pna[s]=name[k];

for(;s<3;s++)//用空格补齐全名字长度

pna[s]='';

while(name[k]!

='.'&&name[k]!

='\0'&&name[k]!

='/')//除去多余字符

k++;

type[0]=type[1]='';

if(name[k]=='.')//取文件类型名

if(flag==8)

{

printf("目录不应该有类型名,查找失败\n");

returnfalse;

}

else

{

//文件遇到类型名认为结束,后面的字符作废

k++;

if(name[k]!

='\0')type[0]=name[k];

k++;

if(name[k]!

='\0')type[1]=name[k];

if(name[k]!

='\0'&&name[k+1]!

='\0')

{

printf("文件名错误\n");

returnfalse;

}

last=1;

}

else

if(name[k]!

='\0')k++;

if(name[k]=='\0')

last=1;

//查找名字等于pna的目录项

fseek(fc,i*64L,SEEK_SET);

fread(buffer2,64L,1,fc);

j=0;

if(last==1&&flag!

=8)//查找名字pna,类型名type的文件目录项

while(j<8&&!

buffer2[j].attribute!

=8&&buffer2[j].name[0]==pna[0]&&buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2])

j++;

else

while(j<8&&!

buffer2[j].attribute==8&&buffer2[j].name[0]==pna[0]&&buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2])

j++;

if(j<8)//找到该目录或文件

if(last==1)//查找结束

{

*dnum=i;

*bnum=j;

returnbuffer2[j].address;

}

else

{

i=buffer2[j].address;

}

else

{

printf("路径错误\n");

returnfalse;

}

}//while查找结束

}//search查找结束

intcreate_file(char*name,intattribute)//建立文件,路径为name,文件属性attribute

{

intdnum,bnum,i,j,last,k,s,d,t,tt,b,dd,flag,dn,bn;

chardname[3],tname[2],pathname[20];

ofilex;

if(attribute%2==1)

{

printf("只读文件,无法写,不能建立\n");

returnfalse;

}

if(openfile.length==n)

{

printf("已打开表已满,不能建立\n");

returnfalse;

}

//将name分为两部分,目录路径pathname和目录名dname

for(j=0;name[j]!

='\0';j++)//查找最后一个'/'

{

if(name[j]=='/')s=j;

}

for(j=0;j

{

pathname[j]=name[j];

}

pathname[j]='\0';//字符数组最后一个置\0

for(k=0,j=s+1;name[j]!

='\0'&&k<3&&name[j]!

='.';j++,k++)//分离文件名

{

dname[k]=name[j];

}

if(k==0)

{

printf("文件名错误或目录名错误\n");

returnfalse;

}

for(;k<3;k++)

{

dname[k]='';

}

k=0;

if(name[j++]=='.')//分离类型名

{

for(;name[j]!

='\0'&&k<2&&name[j]!

='.';j++,k++)

tname[k]=name[j];

}

for(;k<2;k++)

tname[k]='';

if((d=search(pathname,8,&dn,&bn))==false)//找目录路径

{

printf("目录不存在,不能建立\n");

returnfalse;

}

//确认该目录不存在的同时查找空目录项

b=-1;

fseek(fc,d*64L,SEEK_SET);

fread(buffer2,64L,1,fc);//读出D盘块的内容

for(t=0;t<8;t++)

{

if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]&&buffer2[t].type[1]==tname[1])

{

//找到名字dname的文件,建立失败

pr

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2