📄 openfile.cpp
字号:
#include"openfile.h"
#include"errcode.h"
#include<iostream.h>
#include<string.h>
openfile::openfile()
{
//初始化ofile系统
for(int o=0;o<fileno;o++)
{
ofilei[o]=NULL;
}
}
openfile::~openfile()
{
//将未处理的ofile存储
for(int o=0;o<fileno;o++)
{
if(ofilei[o]!=NULL)
{
ifcbi.iput(ofilei[o]->o_fcb);
delete ofilei[o];
ofilei[o]=NULL;
}
}
}
int openfile::readf(fcb *fp,int offset,int count,char*base)
{
//引用fcb层的readi
return ifcbi.readi(fp,offset,count,base);
}
int openfile::writef(fcb *fp,int offset,int count,char*base)
{
//引用fcb层的writei
return ifcbi.writei(fp,offset,count,base);
}
ofile *openfile::openf(fcb *fp,char*filename,int f_mode,int o_mode,int o_mode2)
{
//在ofile系统中寻找
for(int i=0;i<fileno;i++)
{
if(ofilei[i]!=NULL)
{
if(strcmp(ofilei[i]->o_fcb->f_name,filename)==0)
{
if(fp==NULL&&ofilei[i]->o_fcb->f_blkno==0)
{
ofilei[i]->o_count++;
return ofilei[i];
}
int u;
for(int kk=0;kk<263;kk++)
{
u=ifcbi.getblock(fp,kk);
if(u==0)
break;
else
{
if(u==ofilei[i]->o_fcb->f_blkno)
{
if((ofilei[i]->o_fcb->f_mode==IFDIR&&f_mode==IFDIR)||(ofilei[i]->o_fcb->f_mode>=IFREG&&f_mode>=IFREG))
{
ofilei[i]->o_count++;
return ofilei[i];
}
}
}
}
}
}
}
if(o_mode2==1)
return NULL;
//调用fcb层的namei寻找
fcb *ofcb=ifcbi.namei(fp,filename,f_mode);
//无则创建新的
if(ofcb==NULL&&o_mode==0)
{
ofcb=ifcbi.icreate(fp,filename);
ofcb->f_mode=f_mode;
}
else
{
if(ofcb==NULL&&o_mode==1)
return NULL;
}
int o=0;
for(;o<fileno;o++)
{
if(ofilei[o]==NULL)
break;
}
if(o>=fileno)
{
cout<<"OPEN FILE ERROR\n";
return NULL;
}
ofilei[o]=new struct ofile;
ofilei[o]->o_fcb=ofcb;
ofilei[o]->o_count=1;
ofilei[o]->o_offset=0;
return ofilei[o];
}
int openfile::closef(ofile *fileo)
{
//关闭文件,如果ofile没有在被使用,删除ofile
fileo->o_count--;
if(fileo->o_count!=0)
{
return OK;
}
else
{
ifcbi.iput(fileo->o_fcb);
for(int r=0;r<fileno;r++)
{
if(ofilei[r]==fileo)
{
delete fileo;
ofilei[r]=NULL;
return OK;
}
}
}
}
int openfile::deletef(ofile *pfileo,ofile *fileo)
{
//在指定的ofile下删除ofile
if(fileo->o_count>1)
{
cout<<"CANNOT DELETE! THE FILE "<<fileo->o_fcb->f_name<<" IS BEING USED\n";
return -1;
}
else
{
for(int ii=0;ii<fileno;ii++)
{
if(fileo==ofilei[ii])
{
//fileo代表的是文件或空文件夹
if(fileo->o_fcb->f_mode>=IFREG||fileo->o_fcb->f_fsize==0)
{
ifcbi.idelete(pfileo->o_fcb,fileo->o_fcb);
ofilei[ii]=NULL;
delete fileo;
return OK;
}
else
{
//fileo代表的是有文件的文件夹
int revalue;
char*base=new char[fileo->o_fcb->f_fsize+1];
int d_mode;
char d_name[8];
ifcbi.readi(fileo->o_fcb,0,fileo->o_fcb->f_fsize,base);
for(int y=0;y<=(fileo->o_fcb->f_fsize-1)/dsize;y++)
{
for(int d=0;d<8;d++)
{
d_name[d]=base[y*dsize+8+d];
}
d_mode=int((unsigned char)base[y*dsize])*256+int((unsigned char)base[y*dsize+1]);
ofile *curfile=openf(fileo->o_fcb,d_name,d_mode,1);
revalue=deletef(fileo,curfile);
if(revalue==-1)
{
closef(curfile);
return -1;
}
}
revalue=deletef(pfileo,fileo);
if(revalue==-1)
return -1;
delete[]base;
return OK;
}
}
}
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -