文件系统实验报告文档格式.doc
《文件系统实验报告文档格式.doc》由会员分享,可在线阅读,更多相关《文件系统实验报告文档格式.doc(14页珍藏版)》请在冰豆网上搜索。
前k个块的剩余部分包含一组文件描述符。
每个文件描述符包含如下信息:
•文件长度,单位字节
•文件分配到的磁盘块号数组。
该数组的长度是一个系统参数。
在实验中我们可以把它设置为一个比较小的数,例如3。
2.目录:
我们的文件系统中仅设置一个目录,该目录包含文件系统中的所有文件。
除了不需要显示地创建和删除之外,目录在很多方面和普通文件相像。
目录对应0号文件描述符。
初始状态下,目录中没有文件,所有,目录对应的描述符中记录的长度应为0,而且也没有分配磁盘块。
每创建一个文件,目录文件的长度便增加一分。
目录文件的内容由一系列的目录项组成,其中每个目录项由如下内容组成:
•文件名
•文件描述符序号
3.对文件的操作:
文件系统需提供如下函数;
create,destroy,open,read,write。
•create(filename):
根据指定的文件名创建新文件。
•destroy(filename):
删除指定文件。
•open(filename):
打开文件。
该函数返回的索引号可用于后续的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>
malloc.h>
stdlib.h>
string.h>
#defineNULL0
typedefstructmdf{//MDF结构体
charusername[20];
//用户名
charfilename[20];
//文件名
structmdf*next;
}MDF;
typedefstructufd{//UFD结构体
intprotect;
//文件保护码
unsignedintlength;
//文件长度
structufd*next;
}UFD;
typedefstructafd{//AFD结构体
unsignedintpoint;
//文件读写指针
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);
filename);
p->
next=NULL;
fclose(fp);
}
voidprintUFD()//打印MDF表
UFD*p=pufd->
puts("
文件名\t\t保护码\t\t文件长度\n"
while(p){
printf("
\t\t%d"
p->
protect);
\t\t%d\n"
length);
p=p->
voidinitUFD(char*name)//初始化UFD表
pufd=(UFD*)malloc(sizeof(UFD));
UFD*p=pufd;
if((fp=fopen(name,"
))==NULL){
theUFDcannotopen!
feof(fp)){//建立UFD链表
next=(UFD*)malloc(sizeof(UFD));
%d"
&
p->
fgetc(fp);
intcheckuser()//检测登陆的用户名
while
(1){
请输入用户名:
\n"
scanf("
username);
MDF*p=pmdf;
while(p){
if(strcmp(username,p->
username)==0){
strcpy(UserUFD,p->
initUFD(p->
printUFD();
return1;
}
p=p->
}
同户名不存在\n"
voidinitAFD()//初始化AFD
pafd=(AFD*)malloc(sizeof(AFD));
pafd->
boolcreate()//创建文件命令
AFD*pa=pafd;
请输入要创建的文件名:
scanf("
filename);
if(strcmp(filename,p->
filename)==0){
puts("
此文件已经存在了!
return0;
if(!
next)
break;
p=p->
p=p->
strcpy(p->
filename,filename);
protect=2;
length=0;
while(pa->
next){//创建文件后加入到AFD
pa=pa->
pa->
next=(AFD*)malloc(sizeof(AFD));
pa=pa->
strcpy(pa->
filename,filename);
point=0;
return1;
bool_delete()//删除文件命令
请输入要删除的文件名:
UFD*temp;
while(p->
next){
next->
temp=p->
p->
next=p->
free(temp);
printf("
文件%s删除成功!
return1;
要删除的文件不存在!
return0;
boolopen()//打开文件命令
unsignedintprotect;
请输入要打开的文件名:
请输入要打开的文件保护类型:
AFD*pa=pafd->
while(pa){
if(strcmp(filename,pa->
prin