1、实验目的:
掌握文件系统的工作
2、实验要求
(1)编译执行模拟文件系统的实现程序,根据系统实现的功能反复操作,直至熟悉所有
功能。在磁盘上建立一个文件作为文件存储器,此文件相当于一个磁盘分区,并在其上实现
一个简单的单用户文件系统。
(2) 根据代码分析文件系统的磁盘结构、文件目录结构的形式、文件 FCB 各项的含义以
及空闲空间管理的方法。
(3)) 对文件系统的功能实现给出分析描述,并画出流程图,要求分析的功能有:
format:对文件系统进行格式化。
dir:显示文件。
create:建立文件。
write:写文件。wf filename size
read: 读文件。rf filename start size
del: 删除文件。df filename
3、实验环境
windows 环境
4、实验内容
分析模拟文件系统的实现程序,对文件的基本管理数据结构和有关实现过程给出分析,
并画出流程图。
5、程序源代码:
#include
#include
#include
/*1M 磁盘空间*/
/*磁盘快的大小 1K*/
/*路径最长可达 100 字节*/
/*写入文字可达 128k 字节*/
/*最大子目录数 5 (类似五叉树)*/
#define DIR_LENGTH 1024
#define MAX_WRITE 1024*128
#define MEM_D_SIZE 1024*1024
#define DISKSIZE 1024
#define MSD 5
#define DISK_NUM MEM_D_SIZE/DISKSIZE /*磁盘快数目 1024=1M/1K*/
#define FATSIZE DISK_NUM*sizeof(struct fatitem) /*FAT 表大小 8K=8192B (理想应该
是 1.5K)*/
#define MOFN 5
#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 /*根目录起始盘快号 9*/
#define ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小 196*/
/*最大文件打开数 5 (即除根以外最大深度为 5)*/
/*---------------FAT 表项结构-----------------------*/
struct fatitem /* size 8*/
{
int item;
char em_disk; /*磁盘块是否空闲标志位 0 空闲*/
};
/*存放文件下一个磁盘的指针*/
/*-------------------目录项结构------------------------*/
struct direct
{
/* size 196*/
/*-----文件控制快信息-----*/
struct FCB
{
char name[9];
char property;
int size;
int firstdisk;
int next;
int sign;
/*文件/目录名 8 位*/
/*属性 1 位目录 0 位普通文件*/
/*文件/目录字节数(原注释位盘块数)*/
/*文件/目录 起始盘块号*/
/*子目录起始盘块号*/
/*1 是根目录 0 不是根目录*/
}directitem[MSD+2];
};
/*------------------文件打开表项结构--------------------------*/
struct opentable /* size 104*/
{
struct openttableitem /* size 20*/
{
/*文件的大小*/
char name[9]; /*文件名*/
int firstdisk; /*起始盘块号*/
int size;
}openitem[MOFN];
int cur_size;
};
/*当前打文件的数目*/
/*FAT 表*/
/*根目录*/
/*-------------------------------------------------------------------*/
struct fatitem *fat;
struct direct *root;
struct direct *cur_dir;
struct opentable u_opentable; /*文件打开表*/
int
char *bufferdir;
char *fdisk;
/*记录当前路径的名称*/
/*虚拟磁盘起始地址*/
fd=-1;
/*文件打开表的序号*/
/*当前目录*/
void initfile();
void format();
void enter();
void
halt();
int create(char *name);
int open(char *name);
int close(char *name);
int write(int fd,char *buf,int len);
int
int del(char *name);
int mkdir(char *name);
int rmdir(char *name);
void dir();
int cd(char *name);
void print();
void show();
read(int fd,char *buf);
/*----------------------------------------------------------------------------------------------*/
/*------------------------------------------初始化文件系统--------------------------------------*/
void initfile()
{
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M 空间*/
format();
free(fdisk);
}
/*----------------------------------------------------------------------------------------------*/
/*------------------------------------------格式化----------------------------------------------*/
void format()
{
int i;
FILE *fp;
fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算 FAT 表地址(为什么向后偏移 1k)*/
/*-----初始化 FAT 表------------*/
fat[0].item=-1;
/*引导块*/
fat[0].em_disk='1';
for(i=1;idirectitem[0].sign = 1;
root->directitem[0].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next = root->directitem[0].firstdisk;
root->directitem[0].property = '1';
root->directitem[0].size = ROOT_DISK_SIZE;
/*-------指向上一级目录的目录项---------*/
root->directitem[1].sign = 1;
root->directitem[1].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next = root->directitem[0].firstdisk;
root->directitem[1].property = '1';
root->directitem[1].size = ROOT_DISK_SIZE;
for(i=2;idirectitem[i].sign = 0;
root->directitem[i].firstdisk = -1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next = -1;
root->directitem[i].property = '0';
root->directitem[i].size = 0;
}
/*-------测试写入文件的数据---------
for(i=0;idirectitem[i].firstdisk,
root->directitem[i].name,root->directitem[i].next,
root->directitem[i].property,root->directitem[i].sign,
root->directitem[i].size);
}
for(i=0;idirectitem[i],sizeof(struct FCB),1,fp);
printf("%d,%s,%d,%c,%d,%d/n",root->directitem[i].firstdisk,
root->directitem[i].name,root->directitem[i].next,
root->directitem[i].property,root->directitem[i].sign,
root->directitem[i].size);
}
------test end-----*/
if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:/n Cannot open file /n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/
{
printf("Error:/n File write error! /n");
}
fclose(fp);
}
/*----------------------------------------------------------------------------------------------*/
/*--------------------------------进入文件系统--------------------------------------------------*/
void enter()
{
FILE *fp;
int i;
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M 空间*/
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:/nCannot open file/n");
return;
}
if(!fread(fdisk,MEM_D_SIZE,1,fp))
/*把磁盘文件 disk.dat 读入虚拟磁盘空间(内存)*/
{
}
printf("Error:/nCannot read file/n");
exit(0);
fat = (struct fatitem *)(fdisk+DISKSIZE);
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/
/*找到 FAT 表地址*/
fclose(fp);
/*--------------初始化用户打开表------------------*/
for(i=0;i