文件系统实验报告.docx
《文件系统实验报告.docx》由会员分享,可在线阅读,更多相关《文件系统实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
文件系统实验报告
实验二文件系统
实验报告
1.实验简介
本实验要求在假设得I/O系统之上开发一个简单得文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节.用户通过create, open,read等命令与文件系统交互.文件系统把磁盘视为顺序编号得逻辑块序列,逻辑块得编号为0至L—1。
I/O系统利用内存中得数组模拟磁盘。
实际物理磁盘得结构就是多维得:
有柱面、磁道、扇区等概念。
I/O系统得任务就是隐藏磁盘得结构细节,把磁盘以逻辑块得面目呈现给文件系统。
逻辑块顺序编号,编号取值范围为0 至L、、 1,其中L表示磁盘得存储块总数。
实验中,我们可以利用字符数组ldisk[L][B]构建磁盘模型,其中B表示每个存储块得长度。
I/O系统从文件系统接收命令,根据命令指定得逻辑块号把磁盘块得内容读入命令指定得内存区域,或者把命令指定得内存区域内容写入磁盘块.
我设计得文件系统拥有三个用户.
二。
具体说明
1、文件系统得组织:
磁盘得前k个块就是保留区,其中包含如下信息:
位图与文件描述符。
位图用来描述磁盘块得分配情况.位图中得每一位对应一个逻辑块.创建或者删除文件,以及文件得长度发生变化时,文件系统都需要进行位图操作.前k个块得剩余部分包含一组文件描述符。
每个文件描述符包含如下信息:
•文件长度,单位字节
• 文件分配到得磁盘块号数组。
该数组得长度就是一个系统参数.在实验中我们可以把它设置为一个比较小得数,例如3。
2。
目录:
我们得文件系统中仅设置一个目录,该目录包含文件系统中得所有文件.除了不需要显示地创建与删除之外,目录在很多方面与普通文件相像。
目录对应0 号文件描述符。
初始状态下,目录中没有文件,所有,目录对应得描述符中记录得长度应为0,而且也没有分配磁盘块.每创建一个文件,目录文件得长度便增加一分。
目录文件得内容由一系列得目录项组成,其中每个目录项由如下内容组成:
•文件名
• 文件描述符序号
3、对文件得操作:
文件系统需提供如下函数;create,destroy,open,read,write。
•create():
根据指定得文件名创建新文件.
• destroy():
删除指定文件。
•open():
打开文件.该函数返回得索引号可用于后续得read,write, lseek,或close操作。
•close(index):
关闭制定文件.
•read(index,mem_area,count):
从指定文件顺序读入count个字节mem_area指定得内存位置。
读操作从文件得读写指针指示得位置开始。
• write(index,mem_area,count):
把mem_area指定得内存位置开始得count个字节顺序写入指定文件。
写操作从文件得读写指针指示得位置开始。
•lseek(index,pos):
把文件得读写指针移动到pos 指定得位置。
pos就是一个整数,表示从文件开始位置得偏移量。
文件打开时,读写指针自动设置为0。
每次读写操作之后,它指向最后被访问得字节得下一个位置.lseek 能够在不进行读写操作得情况下改变读写指针能位置。
•directory:
列表显示所有文件及其长度。
三。
实验过程
创建文件create:
此时显示文件中得文件:
文件得删除delete:
打开文件(open):
文件得写操作(write):
读文件(read):
关闭文件(close):
退出系统(exit):
四。
实验代码
#include〈stdio、h〉
#include〈malloc、h>
#include
#include#define NULL0
typedefstructmdf{//MDF结构体
char username[20];//用户名
ﻩchar[20];//文件名
structmdf*next;
}MDF;
typedef structufd{//UFD结构体
char [20];//文件名
intprotect;//文件保护码
unsigned intlength;//文件长度
ﻩstructufd*next;
}UFD;
typedefstructafd{//AFD结构体
char [20];//文件名
ﻩintprotect;//文件保护码
unsigned intpoint;//文件读写指针
structafd*next;
}AFD;
MDF*pmdf;//全局链表头指针
UFD*pufd;
AFD *pafd;
charUserUFD[20];//已经登陆成功得用户名
voidinitMDF()//初始化MDF表
{
ﻩFILE*fp;
pmdf= (MDF*)malloc(sizeof(MDF));
ﻩMDF*p=pmdf;
if((fp= fopen("MDF”,”r+"))==NULL){//打开MDF文件
ﻩputs("theMDFcannotopen!
\n”);
ﻩﻩexit
(1);
}
ﻩwhile(!
feof(fp)){//把MDF文件中得内容装入链表
ﻩﻩp-〉next=(MDF*)malloc(sizeof(MDF));
p = p-〉next;
ﻩfscanf(fp,"%s",p-〉username);
fscanf(fp, ”%s”,p—>);
}
ﻩp-〉next=NULL;
ﻩfclose(fp);
}
voidprintUFD()//打印MDF表
{
ﻩUFD*p=pufd-〉next;
ﻩputs("文件名\t\t保护码\t\t文件长度\n");
ﻩwhile (p){
ﻩprintf("%s",p—>);
ﻩprintf("\t\t%d", p-〉protect);
ﻩprintf("\t\t%d\n",p-〉length);
ﻩp=p->next;
}
}
voidinitUFD(char*name)//初始化UFD表
{
ﻩFILE *fp;
pufd=(UFD*)malloc(sizeof(UFD));
UFD*p= pufd;
if((fp= fopen(name, ”r+")) ==NULL){
puts("theUFDcannotopen!
\n");
ﻩexit(1);
ﻩ}
ﻩwhile(!
feof(fp)){//建立UFD链表
p—>next=(UFD*)malloc(sizeof(UFD));
p =p->next;
fscanf(fp,"%s",p-〉);
ﻩﻩfscanf(fp,"%d”,&p-〉protect);
fscanf(fp,”%d",&p—>length);
ﻩfgetc(fp);
ﻩ}
p->next= NULL;
fclose(fp);
}
intcheckuser()//检测登陆得用户名
{
charusername[20];
while
(1){
ﻩputs(”请输入用户名:
\n");
ﻩﻩscanf("%s",username);
ﻩMDF *p=pmdf;
ﻩwhile(p){
ﻩﻩﻩif(strcmp(username, p->username)==0){
ﻩﻩﻩstrcpy(UserUFD,p-〉);
ﻩinitUFD(p->);
ﻩﻩﻩprintUFD();
ﻩreturn1;
ﻩ}
ﻩp=p->next;
ﻩﻩ}
ﻩputs(”同户名不存在\n");
ﻩ}
}
void initAFD()//初始化AFD
{
ﻩpafd=(AFD*)malloc(sizeof(AFD));
pafd—>next= NULL;
}
boolcreate()//创建文件命令
{
ﻩchar [20];
UFD*p= pufd->next;
AFD*pa =pafd;
ﻩputs("请输入要创建得文件名:
\n");
scanf(”%s”,);
while (p){
ﻩﻩif(strcmp(,p—〉) ==0){
ﻩﻩputs("此文件已经存在了!
\n");
ﻩﻩﻩreturn0;
}
ﻩif(!
p—>next)
ﻩbreak;
ﻩﻩp= p->next;
}
p—〉next=(UFD*)malloc(sizeof(UFD));
p=p—〉next;
ﻩstrcpy(p-〉,);
p—>protect=2;
p-〉length= 0;
ﻩp->next=NULL;
while(pa—〉next){//创建文件后加入到AFD
ﻩpa=pa->next;
}
pa->next= (AFD*)malloc(sizeof(AFD));
ﻩpa= pa—〉next;
strcpy(pa—>,);
pa—>protect =2;
ﻩpa—〉point =0;
ﻩpa->next=NULL;
ﻩreturn 1;
}
bool_delete()//删除文件命令
{
ﻩchar[20];
ﻩputs("请输入要删除得文件名:
\n");
scanf("%s”,);
ﻩUFD*p=pufd;
UFD*temp;
ﻩwhile(p-〉next){
ﻩﻩif(strcmp(, p->next->)==0){
ﻩﻩﻩtemp=p->next;
p—>next=p—〉next->next;
ﻩﻩfree(temp);
ﻩﻩﻩprintf("文件%s删除成功!
\n”,);
ﻩﻩreturn1;
ﻩ}
ﻩﻩp= p—〉next;
}
ﻩputs(”要删除得文件不存在!
\n");
ﻩreturn0;
}
boolopen()//打开文件命令
{
ﻩchar [20];
unsignedintprotect;
puts("请输入要打开得文件名:
\n”);
ﻩscanf("%s",);
ﻩputs("请输入要打开得文件保护类型:
\n”);
ﻩscanf(”%d”, &protect);
ﻩUFD*p =pufd—〉next;
ﻩAFD *pa=pafd->next;
ﻩwhile (pa){
ﻩﻩif(strcmp(,pa->)==0){
ﻩﻩprintf("文件%s已经打开!
\n”,);
ﻩreturn1;
ﻩﻩ}
if(!
pa—>next)
ﻩﻩbreak;
pa=pa->next;
ﻩ}
if(!
pa)
ﻩpa=pafd;
ﻩwhile (p){
ﻩif(strcmp(, p—>) == 0){
ﻩﻩﻩpa—〉next= (AFD*)malloc(sizeof(AFD));
ﻩﻩpa=pa->next;
strcpy(pa—> ,p->);
ﻩﻩpa—>protect =protect;
ﻩﻩif(protect ==1)
ﻩﻩpa—>point=0;
ﻩelse
ﻩﻩpa—〉point=p->length;
ﻩﻩpa—>next=NULL;
ﻩﻩprintf("文件%s已经打开!
\n”,);
ﻩﻩreturn1;
}
ﻩﻩp= p—>next;
}
puts("要打开得文件不存在!
\n”);
return0;
}
voidclose()//关闭文件命令
{
ﻩchar[20];
ﻩUFD*pu= pufd->next;
ﻩputs("请输入要关闭得文件名:
\n”);
ﻩscanf("%s",);
ﻩAFD *p= pafd;
AFD *temp;
ﻩwhile(p&&p-〉next){
ﻩif(strcmp(, p->next—>)==0){
ﻩtemp=p—>next;
ﻩﻩﻩp->next=p—〉next-〉next;
if(temp->protect==2){
ﻩﻩwhile(pu){
ﻩﻩﻩif(strcmp(temp->,pu->)==0){
ﻩﻩﻩﻩpu->length=temp->point;
ﻩﻩﻩﻩbreak;
ﻩﻩﻩ}
ﻩﻩﻩpu=pu->next;
ﻩﻩﻩﻩ}
ﻩﻩ}
free(temp);
printf(”文件%s关闭成功!
\n”,);
ﻩﻩﻩreturn;
ﻩ}
ﻩﻩp= p-〉next;
}
ﻩﻩputs(”要关闭得文件没有被打开!
\n”);
}
intread()//读文件命令
{
char [20];
unsignedint length;
ﻩAFD*p=pafd—>next;
puts("请输入要读得文件名:
\n");
scanf("%s”,);
ﻩputs("请输入要读得长度\n");
ﻩscanf("%d", &length);
while(p){
if(strcmp(,p->)== 0){
ﻩﻩﻩp—>point+= length;
ﻩprintf("文件%s读取成功!
\n", );
ﻩﻩreturn 1;
ﻩ}
ﻩp=p—〉next;
ﻩ}
ﻩputs("读取失败文件没有打开过!
\n");
ﻩreturn 0;
}
intwrite()//写文件命令
{
char[20];
unsignedintlength;
ﻩAFD*p =pafd->next;
puts("请输入要写得文件名:
\n”);
scanf(”%s",);
while(p){
if(strcmp(,p->)==0){
ﻩﻩif(p->protect!
=2){
ﻩﻩprintf("文件%s不可写!
\n”,);
ﻩﻩreturn 0;
}
ﻩﻩﻩputs(”请输入要写得长度\n");
ﻩﻩscanf("%d",&length);
ﻩp-〉point +=length;
ﻩprintf("文件%s写入成功!
\n",);
return1;
}
p=p->next;
ﻩ}
ﻩputs("写入失败文件没有打开过!
\n");
ﻩreturn0;
}
void destroy()//释放内存
{
ﻩMDF *pm =pmdf;
ﻩwhile(pm){
ﻩpmdf= pmdf-〉next;
ﻩﻩfree(pm);
pm=pmdf;
ﻩ}
ﻩAFD*pa=pafd;
ﻩwhile(pa){
ﻩpafd=pafd—〉next;
ﻩfree(pa);
ﻩpa = pafd;
ﻩ}
UFD*pu= pufd;
ﻩwhile(pu){
ﻩpufd =pufd—>next;
ﻩfree(pu);
ﻩpu= pufd;
ﻩ}
}
voidsaveUFD()//保存UFD文件
{
FILE*fp;
ﻩUFD*p=pufd->next;
ﻩif((fp =fopen(UserUFD,"w”))==NULL){
ﻩputs(”theUFDcannotopen!
\n”);
ﻩexit(1);
}
while(p){
ﻩﻩfprintf(fp, ”%s",”\n”);
fprintf(fp, "%s%s",p—>,"\t\t");
ﻩfprintf(fp, ”%d%s",p—〉protect,”\t\t");
ﻩfprintf(fp,"%d”, p—>length);
ﻩﻩp=p->next;
ﻩ}
ﻩfclose(fp);
}
voidexit()//推出系统
{
ﻩAFD*pa= pafd—〉next;
UFD*pu=pufd->next;
while(pa){
ﻩif(pa->protect ==2){
while(pu){
ﻩﻩif(strcmp(pa->, pu->)==0){
ﻩpu-〉length=pa—〉point;
ﻩbreak;
ﻩ}
ﻩﻩpu=pu->next;
ﻩ}
ﻩ}
ﻩpa =pa—〉next;
ﻩ}
saveUFD();
printUFD();
ﻩdestroy();
}
voidoperate()//命令识别
{
while
(1){
ﻩchar mand[20];
ﻩﻩcharname[][8]={"create","delete”,”open", "close","read",”write”,”exit"};
ﻩputs("请输入命令:
\n”);
scanf("%s",mand);
if(strcmp(mand,name[0])== 0)
ﻩcreate();
ﻩelseif(strcmp(mand,name[1]) ==0)
ﻩﻩ_delete();
ﻩﻩelseif(strcmp(mand,name[2])==0)
ﻩﻩopen();
ﻩelseif(strcmp(mand,name[3])==0)
close();
ﻩﻩelse if(strcmp(mand,name[4])== 0)
ﻩﻩread();
ﻩﻩelse if(strcmp(mand,name[5]) ==0)
ﻩwrite();
elseif(strcmp(mand, name[6] ) ==0){
ﻩﻩﻩexit();
ﻩreturn;
ﻩ}else
ﻩﻩputs("无效命令,请重新输入:
\n");
}
}
void print()
{
puts("文件系统\n”);
puts("***使用说明***:
\n");
ﻩputs("本文件系统共有三个用户分别就是user1user2 user3\n\
ﻩ系统命令有create, delete, open,close,read, write,exit\
\nexit—---—----——-—--—--——---—----—--—---——-—-退出系统”);
}
intmain()
{
print();
initMDF();
checkuser();
ﻩinitAFD();
ﻩoperate();//命令识别
ﻩreturn0;
}