⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 openfile.cpp

📁 在Linux Red Hat下用C++设计并实现一个多用户多级目录结构的文件系统。
💻 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 + -