#include"file.h"
extern fileinfo file[FILENUM];
extern int filenum;
extern int FAT[DISC],blankspace;
void write(char *tmpname,int tmplen)
//功能:写新文件
//参数说明:
//tmpname-要写入的文件名,tmplen-要写入的文件长度
{
int last;
//复制文件名和文件块个数
strcpy(file[filenum].filename,tmpname);
file[filenum].filelen=tmplen;
//存文件
for(int i=2;i<DISC;i++)
{
if(FAT[i]==0)
{
last=file[filenum].filestart=i;//首个空闲块为文件开始块
break;
}
}
for(i=1;i<=tmplen;i++)
{ //last为上个记录的位置
for(int j=last+1;j<DISC;j++)
if(FAT[j]==0)
{
FAT[last]=j;
last=j;
break;
}
}
FAT[last]=FFF;//文件末存结束标记
blankspace-=tmplen;//改变空闲块个数
cout<<endl<<"FILE "<<filenum++<<endl;
cout<<"name and size :"<<tmpname<<" "<<tmplen<<endl;
}
void cover(char *tmpname,int tmplen)
//功能:覆盖写文件
//参数说明:
//tmpname-要覆盖的文件名,tmplen-要写入的文件长度
{
int last,end;
//寻找要覆盖的文件,将其数组下标存入last
for(int i=0;i<filenum;i++)
{
if(strcmp(file[i].filename,tmpname)==0) last=i;
break;
}
//若要写入文件长度小于原文件长度
if(file[last].filelen>tmplen)
{ //寻找结束位
for(int i=0;i<tmplen;i++)
end=FAT[i];
//逐位置零
for(i=FAT[end],FAT[end]=FFF;FAT[i]!=FFF;)
{
end=i;
i=FAT[end];
FAT[end]=0;
}
FAT[end]=0,FAT[i]=0;
}
//若要写入文件长度大于原文件长度
else if(file[last].filelen<tmplen)
{
//写入前判断是否有足够空间
if(tmplen>blankspace-file[last].filelen)
{
cout<<"not enough space!"<<endl;
return;
}
//寻找原结束标记,存入end
for(int end=file[last].filestart;FAT[end]!=FFF;end=FAT[end]);
//从结束位开始,寻找空闲块存入文件
for(int i=0;i<tmplen-file[last].filelen;i++)
for(int j=0;j<DISC;j++)
if(FAT[j]==0)//块空闲则插入
{
FAT[end]=j;
end=j;
}
FAT[end]=FFF;
}
//改变空闲块个数与文件长度
blankspace-=file[last].filelen-tmplen;
file[last].filelen=tmplen;
cout<<endl<<"FILE "<<(filenum-1)<<endl;
cout<<"name and size :"<<tmpname<<" "<<tmplen<<endl;
}
void insert(char *tmpname,int insertpoint)
//功能:在文件指定位置插入一个块
//参数说明:
//tmpname-要执行插入操作的文件名,insertpoint要插入块的位置
{
int last,brpoint;
//寻找要执行插入操作的文件,将其数组下标存入last
for(int i=0;i<filenum;i++)
if(strcmp(file[i].filename,tmpname)==0)
{
last=i;
break;
}
if(insertpoint>=file[last].filelen)
{
cout<<"插入点溢出"<<endl;
return;
}
//brpoint记录当前文件扫描到的位置
brpoint=file[last].filestart;
for(i=0;i<insertpoint-1;i++)
brpoint=FAT[brpoint];//扫描直到找到插入位置
//寻找一个空闲块插入
for(i=0;i<DISC;i++)
if(FAT[i]==0)
{
FAT[i]=FAT[brpoint];
FAT[brpoint]=i;
break;
}
//改变空闲块个数与文件长度
file[last].filelen++;
blankspace--; cout<<endl<<"FILE "<<(filenum-1)<<endl;
cout<<"name and size :"<<tmpname<<" "<<file[last].filelen<<endl;
}