1、 .
#include
2、1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小 #define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5
3、//最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名 8位*/ char property; /*属性 1位目录 0位普通
4、文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录 0不是根目录*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件
5、的大小*/ }openitem[MOFN]; int cur_size; /*当前打文件的数目*/ }; struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/ struct direct *cur_dir; /*当前目录*/ struct opentable u_opentable; /*文件翻开表*/ int fd=-1; /*文件翻开表的序号*/ char *bufferdir; /*记录当前路径的名称*/ char *fdisk; /*虚拟
6、磁盘起始地址*/ 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 read(int fd,char *buf); int del(char *name); int mkdir(char *name); int rmdir(char *
7、name); void dir(); int cd(char *name); void print(); void show(); void initfile() { fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/ format(); } void format() { int i; FILE *fp; fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址,引导区向后偏移 1k)*/
8、/*-----初始化FAT表------------*/
fat[0].item=-1; /*引导块*/
fat[0].em_disk='1';
for(i=1;i 9、ISK_NUM;i++)
{
fat[i].item = -1;
fat[i].em_disk = '0';
}
/*-----------------------------------------------*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/
/*初始化目录*/
/*---------指向当前目录的目录项---------*/
root->directitem[0].sign = 1;
root->directitem[0].fir 10、stdisk = 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] 11、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;
if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file 12、 \n");
return;
}
for(i=2;i 13、
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;
14、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:\nCanno 15、t read file\n");
exit(0);
}
fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/
fclose(fp);
/*--------------初始化用户翻开表------------------*/
for(i=0;i 16、u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
}
u_opentable.cur_size = 0;
cur_dir = root; /*当前目录为根目录*/
bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));
strcpy(bufferdir,"Root:");
}
void halt()
{
FILE *fp;
int i;
i 17、f((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虚拟磁盘空间(存)容读入磁盘文件disk.dat */
{
printf("Error:\nFile write error!\n");
}
fclose(fp);
free(fdisk);
free(buff 18、erdir);
return;
}
int create(char *name)
{
int i,j;
if(strlen(name)>8) /*文件名大于 8位*/
return(-1);
for(j=2;j 19、);
for(i=2;i 20、j 后退出*/
{
if(fat[j].em_disk=='0')
break;
}
if(j>=DISK_NUM)
return(-5);
fat[j].em_disk = '1'; /*将空闲块置为已经分配*/
/*-----------填写目录项-----------------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk = j;
cur_dir->direct 21、item[i].size = 0;
cur_dir->directitem[i].next = j;
cur_dir->directitem[i].property = '0';
/*---------------------------------*/
fd = open(name);
return 0;
}
int open(char *name)
{
int i, j;
for(i=2;i 22、ur_dir->directitem[i].name,name))
break;
}
if(i>=MSD+2)
return(-1);
/*--------是文件还是目录-----------------------*/
if(cur_dir->directitem[i].property=='1')
return(-4);
/*--------文件是否翻开-----------------------*/
for(j=0;j 23、strcmp(u_opentable.openitem[j].name,name))
break;
}
if(j 24、firstdisk==-1)
break;
}
/*--------------填写表项的相关信息------------------------*/
u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;
strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size = cur_dir->directitem[i].size;
u_open 25、table.cur_size++;
/*----------返回用户翻开表表项的序号--------------------------*/
return(j);
}
int close(char *name)
{
int i;
for(i=0;i 26、清空该文件的用户翻开表项的容---------------------*/
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
u_opentable.cur_size--;
return 0;
}
int write(int fd, char *buf, int len)
{
char *first;
i 27、nt item, i, j, k;
int ilen1, ilen2, modlen, temp;
/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/
char Space = 32;
char Endter= '\n';
for(i=0;i 28、读取用户翻开表对应表项第一个盘块号-----------------------*/
item = u_opentable.openitem[fd].firstdisk;
/*-------------找到当前目录所对应表项的序号-------------------------*/
for(i=2;i 29、最后一块磁盘块-------------------*/
while(fat[item].item!=-1)
{
item =fat[item].item; /*-查找该文件的下一盘块--*/
}
/*-----计算出该文件的最末地址-------*/
first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;
/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/
if(DISKSIZE-u_opentable.openitem[fd] 30、size%DISKSIZE>len)
{
strcpy(first,buf);
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
{/*写一局部容到最后一块磁盘块的 31、剩余空间(字节)*/
first[i] = buf [i];
}
/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if(modlen>0)
ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/
for(j=0;j 32、)
{
for(i=ROOT_DISK_NO+1;i 33、DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)
first[k] = buf[k];
}
else/*-如果不是要最后分配的一块--*/
{
for(k=0;k 34、/
fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/
}
/*--修改长度-*/
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
return 0;
}
int read(int fd, char *buf)
{
int len = u_opentabl 35、e.openitem[fd].size;
char *first;
int i, j, item;
int ilen1, modlen;
item = u_opentable.openitem[fd].firstdisk;
ilen1 = len/DISKSIZE;
modlen = len%DISKSIZE;
if(modlen!=0)
ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/
first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/
for(i= 36、0;i 37、sk+item*DISKSIZE;
}
}
return 0;
}
int del(char *name)
{
int i,cur_item,item,temp;
for(i=2;i 38、/
return(-1);
if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/
return(-3);
for(i=0;i 39、
while(item!=-1) /*--释放空间,将FAT表对应项进展修改-*/
{
temp = fat[item].item;
fat[item].item = -1;
fat[item].em_disk = '0';
item = temp;
}
/*-----------------释放目录项-----------------------*/
cur_dir->directitem[cur_item].sign = 0;
cur_dir->directitem[cur_item].firstdisk = -1;
40、 strcpy(u_opentable.openitem[cur_item].name,"");
cur_dir->directitem[cur_item].next = -1;
cur_dir->directitem[cur_item].property = '0';
cur_dir->directitem[cur_item].size = 0;
return 0;
}
int mkdir(char *name)
{
int i,j;
struct direct *cur_mkdir;
if(!strcmp(name, 41、"."))
return(-4);
if(!strcmp(name,".."))
return(-4);
if(strlen(name)>8) /*-如果目录名长度大于 8位-*/
return(-1);
for(i=2;i 42、) /*-判断是否有重名-*/
{
if(!strcmp(cur_dir->directitem[j].name,name))
break;
}
if(j 43、 /*-将该空闲块设置为已分配-*/
/*-------------填写目录项----------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk=j;
cur_dir->directitem[i].size=ROOT_DISK_SIZE;
cur_dir->directitem[i].next=j;
cur_dir->directitem[i].property='1';
/*-所创目录在虚拟磁盘上的地址(存物理地址)-*/
44、cur_mkdir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE);
/*-初始化目录-*/
/*-指向当前目录的目录项-*/
cur_mkdir->directitem[0].sign=0;
cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk;
strcpy(cur_mkdir->directitem[0].name,".");
cur_mkdir->directitem[0].nex 45、t=cur_mkdir->directitem[0].firstdisk;
cur_mkdir->directitem[0].property='1';
cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;
/*-指向上一级目录的目录项-*/
cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign;
cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk;
strcpy(cur_m 46、kdir->directitem[1].name,"..");
cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk;
cur_mkdir->directitem[1].property='1';
cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;
for(i=2;i 47、i].firstdisk=-1;
strcpy(cur_mkdir->directitem[i].name,"");
cur_mkdir->directitem[i].next=-1;
cur_mkdir->directitem[i].property='0';
cur_mkdir->directitem[i].size=0;
}
return 0;
}
int rmdir(char *name)
{
int i,j,item;
struct direct *temp_dir;
/*-检查当前目录项中有无该目录-*/ 48、
for(i=2;i 49、].next*DISKSIZE);
for(j=2;j 50、titem[i].sign=0;
cur_dir->directitem[i].firstdisk=-1;
strcpy(cur_dir->directitem[i].name,"");
cur_dir->directitem[i].next=-1;
cur_dir->directitem[i].property='0';
cur_dir->directitem[i].size=0;
return 0;
}
void dir()
{
int i;
for(i=2;i