文件管理实验报告

时间:2024.3.19

实验题目文件管理

一.实验目的

本实验模拟操作系统中的建立文件、删除文件、建立目录、显示目录、改变目录和删除目录等操作。通过该实验使学生了解文件系统的基本结构和文件的各种管理方法。

二.实验原理

文件通常存放在外存(如磁盘、磁带)上,可以作为一个独立单位存放和实施相应的操作(如打开、关闭、读、写等)。为了加快对文件的检索,往往将文件控制块集中在一起进行管理。这种文件控制块的有序集合称为文件目录。文件控制块就是其中的目录项。图6-1示例一种目录的组织形式。


三.实验内容

模拟一个文件系统,包括目录文件,普通文件,并实现对它们的一些基本操作。假定每个目录文件最多只能占用一个块;一个目录项包括文件名(下一级目录名),文件类型,文件长度,指向文件内容(下一级目录)的指针内容。普通文件可以只用目录项(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的数组来模拟磁盘

typedef struct tree

{char name[3]; /*文件或目录名*/

char type[2]; /*文件类型名*/

char attribute; /*属性*/                 // 0 表示文件,1表示目录.

char address; /*文件或目录的起始盘块号*/

char length; /*文件长度,以盘块为单位*/

struct tree *l,*r;/*文件或目录的链式结构*/

}content; /*目录结构*/

typedef struct

{int dnum; /*磁盘盘块号*/

int bnum; /*盘块内第几项*/

}pointer; /*已打开文件表中读写指针的结构*/

typedef struct

{char name[20]; /*文件绝对路径名*/

char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/

int number; /*文件起始盘块号*/

int length; /*文件长度,文件占用的字节数*/

int flag; /*操作类型,用"0"表示以读操作方式开文件,用"1"表示写操作方式打开文件*/

pointer read; /*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnum为"0"*/

pointer write;

/*写文件的位置,文件建立时dnum为文件起始盘块号,bnum为"0",打开时为文件末尾*/

}OFILE; /*已打开文件表项类型定义*/

struct

{

OFILE file[N]; /*已打开文件表*/

int length; /*已打开文件表中登记的文件数量*/

}openfile; /*已打开文件表定义*/

char buffer1[64];/*模拟缓冲1*/ //模拟磁盘上的物理块中存放的具体数据

content buffer2[8];/*模拟缓冲2*/ //模拟磁盘上的物理块中存放的目录

FILE *fc; /*模拟磁盘的文件指针*/

sopen(char *name)// 在已打开文件表中查找文件name{}

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

iopen(content *x)// 在已打开文件表openfile数组中插入文件name{}

int allocate( ) // 分配一个磁盘块,返回块号。从FAT中依次查找,找到一个空闲的磁盘区,返回它的编号

{for(i=0;i<100;i++)

   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 ;//若找到则返回此文件的磁块号}

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])

{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;}         

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",q1->name );

printf("Please input the type of the file(2 letters):\n");// 输入文件类型

scanf("%s",q1->type );

q1->address =allocate();//文件起始盘块号

q1->attribute =0;

printf("Please input the content of the file(less than 100 letters):\n");//输入文件内容

scanf("%s",h[q1->address]); //并将文件内容存放到磁块中

printf("建立文件成功!\n");}

open_file(content * &p)           //打开文件

{ 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()函数

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");        //输入文件名

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])//判断文件名与当前目录中的相同名

   {q2=p->l; //释放时用q2来释放

    p->l=p->l->r;//删除文件或目录,即将其从链表中除去

    free(q2);

    printf("删除成功!\n");}

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])

{ 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; }}}

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                         //判断当前位置以及建立文件的目录

{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",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");        //输入文件名

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])//判断文件名与当前目录中的相同名

   { 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;}

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");//判断是文件还是目录

   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");

q=q->r;}}

else

    printf("NO folders!\n");//不存在文件或目录显示no folders!

return 0;}

content * cd_(content * &p,content * head)//返回顶级目录,主目录 !!注意此函数为递归,注意参数的使用

{ content * q;

q=head;

if (q->l==p)

{p=q;

return p;}

else if(q->r=p)

   {p=q;

return p;}

if (q)

{ cd_(p,q->l);//左孩子的递归

   cd_(p,q->r) ;//右孩子的递归}

//return 0;}

print()//显示界面函数

{printf("\n**********************************\n");

printf(" 1:建立文件\n");

printf(" 2:打开文件\n");

printf(" 3:删除文件或目录\n");

printf(" 4:建立目录\n");

printf(" 5:显示目录内容\n");

printf(" 6:进入子目录\n");

printf(" 7:返回主目录\n");

printf(" 0:退出\n");

printf("**********************************\n");}

int main(int argc, char* argv[])

{   content *p,jolan, *head;           //P 是指向当前目录的指针,jolan为根目录

char in;

char str[100]={0}; //用作目录显示

char str1[100][100]={0};

int k=0;

p=head=(content *)malloc (sizeof(content));//向内存申请新的空间作为结点

p->l=p->r=0;//结点初使化

strcpy(p->name ,"Jolan");

strcpy(str,p->name);

strcat(str,":\\");

strcpy(str1[0],str);

print();//调用显示函数,显示界面

printf("%s:\\>",head->name);

in=getchar();

while(in !='0')//循环调用各函数,实现用户的交互

{switch(in)

{case '4': md(p); break;

case '6': cd(p); strcat(str,p->name); strcat(str,"\\");strcpy(str1[++k],str); break;//对串进行的各操作是为了作为显示目录用

case '5': dir(p);break;

case '7': p=head; strcpy(str,str1[0]); break;

case '1': create_file(p); break;

case '3': Delete(p);break;

case '2':open_file(p); break; }

if (in!=10) {print();printf("%s>",str);}//不接受换行符

in=getchar();}

return 0;}

运行结果

更多相关推荐:
文件管理实验报告

文件管理一实验目的1了解os中文件的组织和管理2熟悉文件中所用的数据结构二实验要求1设计一个N个用户的文件系统每个用户最多保存m个文件2限制用户在一次使用中只能打开L个文件3系统应能检查输入命令的正确性出错能显...

操作系统 实验报告 文件管理

昆明理工大学信息工程与自动化学院学生实验报告201201学年第二学期课程名称操作系统开课实验室年月日一实验目的用C或C语言编写和调试一个简单的文件系统模拟文件管理的基本功能从而对各种文件操作命令的实质内容和执行...

文件目录管理实验报告

OS课程设计采用二级目录实现文件管理操作系统课程设计报告采用二级目录实现文件管理学院信息工程学院班级计科1002班姓名杨辉学号101304230指导教师邹姝稚时间20xx年1月成绩117OS课程设计采用二级目录...

操作系统实验报告 文件管理系统 源程序

操作系统实验报告操作系统实验报告题目班级文件管理系统20xx年12月21日1操作系统实验报告目录一实践内容311实验内容32实验原理43实验要求4二实验的目的及意义4三详细设计531功能设计532结构设计633...

文件管理系统实验报告

华中师范大学计算机科学系实验报告书实验题目基于两级目录结构的简单文件系统的管理与操作课程名称操作系统主讲教师辅导教师叶俊民教授班级1班实验时间20xx年12月10日目录CDIO性质的实践步骤2构思性实践C做什么...

【电大本科操作系统实验报告】文件管理

1234567

实验三操作系统文件管理实验报告

计算机导论实验3实验报告实验3操作系统文件管理班级学号姓名1DOS目录文件夹和文件1快速测试问题的总结报告2Explore中123456789102Windows目录文件夹和文件1快速测试问题的总结报告2123...

操作系统文件管理实验报告

实验报告课程名称计算机操作系统实验名称班级学号姓名成绩指导教师赵安科实验日期20xx年6月18日一实验题目文件管理二实验内容模拟文件存储空间的管理采用空白文件目录法和空白块链法实施空间分配三实验说明文件存储空间...

实验3 操作系统文件管理实验报告

计算机导论实验3实验报告实验3操作系统文件管理班级学号姓名1DOS目录文件夹和文件1说明以下命令的功能adir命令bcd命令cmkdir命令dcopy命令eecho命令fcopy命令gdel命令hrd命令提示可...

文件或文件夹管理实验报告

实验二文件和文件夹的管理一实验目的通过本实验掌握文件和文件夹的组织和管理二实验任务文件文件夹的建立复制移动删除重命名更改文件或文件夹的属性三实验过程1练习一1重命名练习把文件READMEtxt改名为HELPtx...

实验报告-文件管理与资源共享

Windows管理课程班级姓名实训项目完成日期实训报告一实训目的二实训要求1在C盘根目录下创建share文件夹并共享该文件夹共享名为webshare共享权限设置为只读2继续共享share文件夹共享名为wwwsh...

实验四 文件管理报告

昆明理工大学信息工程与自动化学院学生实验报告20xx20xx学年第二学期一实验目的用C或C语言编写和调试一个简单的文件系统模拟文件管理的基本功能从而对各种文件操作命令的实质内容和执行过程有比较深入的了解二实验原...

文件管理实验报告(33篇)