文件管理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ p=p->l;}
else //由于目录管理的数据结构为二叉树,所以需要对二叉树进行遍历
{q=q->l;
while(q->r !=0)
if (q->r ->name[0] ==str[0]&&q->r ->name[1] ==str[1]&&q->r ->name[2] ==str[2])
{q=q->r; p=q; break;}
三.实验内容
模拟一个文件系统,包括目录文件,普通文件,并实现对它们的一些基本操作。假定每个目录文件最多只能占用一个块;一个目录项包括文件名(下一级目录名),文件类型,文件长度,指向文件内容(下一级目录)的指针内容。普通文件可以只用目录项(FCB)代表。
四.实验环境
软件环境:Visual C++6.0
五.试验步骤
源程序
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h" //头文件
#define N 10
int i,j;
char h[100][100]={0}; //用一个100*100的数组来模拟磁盘
scanf("%s",q1->name );
printf("Please input the type of the file(2 letters):\n");//输入文件类型
scanf("%s",q1->type );
q1->address =allocate();//文件起始盘块号
q1->attribute =0;
char buffer1[64];/*模拟缓冲1*/ //模拟磁盘上的物理块中存放的具体数据
content buffer2[8];/*模拟缓冲2*/ //模拟磁盘上的物理块中存放的目录
FILE *fc; /*模拟磁盘的文件指针*/
sopen(char *name)//在已打开文件表中查找文件name{}
else //由于目录管理的数据结构为二叉树,所以需要对二叉树进行遍历
{q=q->l;
while(q->r !=0) //对根目录的左子树的右子树进行遍历,即为树中父结点的孩子结点
{ if (q->r ->name[0]==file.name [0]&&q->r ->name[1] ==file.name[1]&&q->r ->name[2] ==file.name[2])
else q=q->r;}}}
else
printf("NO folders!");
return 0;}
dir(content * &p) //显示目录及文件
{content *q,*q1;
q=p;
if (q->l!=0)
{printf("%s",q->l->name );
if (q->l->attribute ==1) printf(" <DIR>\n");//判断是文件还是目录
scanf("%s",str );
if (p!=0)
{//P是指向当前目录的指针,不能轻易改变,引入q来代替p
if (q->l!=0)
{if (q->l ->name[0] ==str[0]&&q->l ->name[1] ==str[1]&&q->l ->name[2] ==str[2])//判断文件名与当前目录中的相同名
{q=q->l;
while(q->r !=0)
q=q->r;
q->r=q1=(content *)malloc (sizeof(content));//向内存申请新的空间作为结点
q->r->l=q->r->r=0;}
printf("Please input the name of file(3 letters):\n"); //输入文件名
char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/
int number; /*文件起始盘块号*/
int length; /*文件长度,文件占用的字节数*/
int flag; /*操作类型,用"0"表示以读操作方式开文件,用"1"表示写操作方式打开文件*/
pointer read; /*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnum为"0"*/
dopen(char *name)//在已打开文件表中删除文件name{}
iopen(content *x)//在已打开文件表openfile数组中插入文件name{}
int allocate( ) //分配一个磁盘块,返回块号。从FAT中依次查找,找到一个空闲的磁盘区,返回它的编号
{for(i=0;i<100;i++)
else //判断当前位置以及建立文件的目录
{q=q->l;
while(q->r !=0)
q=q->r;
q->r=q1=(content *)malloc (sizeof(content));//向内存申请新的空间作为结点
q->r->l=q->r->r=0;//新结点的初使化
}
printf("Please input the name of file(3 letters):\n"); //输入文件名
scanf("%s",str );
if (p!=0)
{ //P是指向当前目录的指针,不能轻易改变,引入q来代替p
if (q->l!=0)
{if (q->l ->name[0] ==str[0]&&q->l ->name[1] ==str[1]&&q->l ->name[2] ==str[2])//判断文件名与当前目录中的相同名
scanf("%s",q1->name );
q1->attribute =1; //用1表示新建的为目录属性
printf("新建目录成功!\n");
return 0;}
cd(content * &p)//进入下一级子目录函数
{content *q,*q1;
char str[3];
q=q1=p;
printf("Please input the name of file(3 letters):\n"); //输入文件名
{return q->r->address ;break;}//返回文件的磁块号
else q=q->r;//否则指针指向下一结点,继续遍历
}}}
create_file(content * &p)//建立文件
{ content file,*q,*q1;
q=p;
if( q->l==0)
{q->l =q1=(content *)malloc (sizeof(content)); q->l->l=q->l->r=0;}
{q2=p->l; //释放时用q2来释放
p->l=p->l->r;//删除文件或目录,即将其从链表中除去
free(q2);
printf("删除成功!\n");}
else //由于目录管理的数wenku.baidu.com结构为二叉树,所以需要对二叉树进行遍历
{q=q->l;
while(q->r !=0)
if (q->r ->name[0] ==str[0]&&q->r ->name[1] ==str[1]&&q->r ->name[2] ==str[2])
struct tree *l,*r;/*文件或目录的链式结构*/
}content; /*目录结构*/
typedef struct
{int dnum; /*磁盘盘块号*/
int bnum; /*盘块内第几项*/
}pointer; /*已打开文件表中读写指针的结构*/
typedef struct
{char name[20]; /*文件绝对路径名*/
else
printf("NO folders!\n");
return 0;}
md(content * &p)//新建目录函数
{ content file,*q,*q1;
q=p;
if( q->l==0)
{q->l =q1=(content *)malloc (sizeof(content)); q->l->l=q->l->r=0;} else //判断当前位置以及建立文件的目录
{ q2=q->r; //释放时用q2来释放
if(q->r->r!=0) q->r=q->r->r;//删除文件或目录,即将其从链表中除去
else q->r=0; //!!!!!!!!!!!!注意!!!!!!!链表的删除!!!
free(q2);
printf("删除成功!\n");
break;}
else q=q->r;}}}
printf("打开文件成功!\n");}
close_file(char *name)
{}
Delete(content * &p)//文件或目录的删除
{content *q,*q1,*q2;
char str[3];
q=q1=p;
printf("Please input the name of file(3 letters):\n"); //输入文件名
typedef struct tree
{char name[3]; /*文件或目录名*/
char type[2]; /*文件类型名*/
char attribute; /*属性*/ // 0表示文件,1表示目录.
char address; /*文件或目录的起始盘块号*/
char length; /*文件长度,以盘块为单位*/
{ int b;
content file;
printf("Please input the name of file(3 letters):\n");//输入要查找的文件名
scanf("%s",file.name );
printf("%s\n",h[search(p,file)]); //输出文件内容这里调用了自定义search()函数
if(h[i][99]==0)
{ h[i][99]=1;
return i; //返回数组号,即为盘块号
break; }}
int search(content *p,content file) //查找路径名为name的文件或目录,返回该目录的起始盘块号,P是指向当前目录的指针
{content *q,*q1; //P是指向当前目录的指针,不能轻易改变,引入q来代替p
q=p;
if (q->l ->name[0] ==file.name[0]&&q->l ->name[1] ==file.name[1]&&q->l ->name[2] ==file.name[2])//判断文件名与当前目录中的相同名
{return q->l->address ;//若找到则返回此文件的磁块号}
printf("Please input the content of the file(less than 100 letters):\n");//输入文件内容
scanf("%s",h[q1->address]); //并将文件内容存放到磁块中
printf("建立文件成功!\n");}
open_file(content * &p) //打开文件
else printf(" <FILE>\n");
q=q->l;//指针指向下一结点
while(q->r!=0)
{printf("%s",q->r->name);
if (q->r->attribute ==1) printf(" <DIR>\n");//判断是文件还是目录
else printf(" <FILE>\n");
pointer write;
/*写文件的位置,文件建立时dnum为文件起始盘块号,bnum为"0",打开时为文件末尾*/
}OFILE; /*已打开文件表项类型定义*/
struct
{
OFILE file[N]; /*已打开文件表*/
int length; /*已打开文件表中登记的文件数量*/
}openfile; /*已打开文件表定义*/
实验题目文件管理
一.实验目的
本实验模拟操作系统中的建立文件、删除文件、建立目录、显示目录、改变目录和删除目录等操作。通过该实验使学生了解文件系统的基本结构和文件的各种管理方法。
二.实验原理
文件通常存放在外存(如磁盘、磁带)上,可以作为一个独立单位存放和实施相应的操作(如打开、关闭、读、写等)。为了加快对文件的检索,往往将文件控制块集中在一起进行管理。这种文件控制块的有序集合称为文件目录。文件控制块就是其中的目录项。图6-1示例一种目录的组织形式。
q=q->r;}}
else
printf("NO folders!\n");//不存在文件或目录显示no folders!
相关文档
最新文档