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

📄 nfile.h

📁 本科作业虚拟linux操作系统下的文教系统
💻 H
字号:


#ifndef Nfile_tag
#define Nfile_tag

#include <vector>
#include <string>
#include <iostream>

#define INDEXFILE  1
#define COMMONFILE  2

class Index_File;


class Nfile//文件类
{
protected:
	DiNode *inode;//指向idode
	std::string filename;
	Index_File *parent;
public:

	Nfile(std::string fname,DiNode *ide,Index_File *par)
	{
		filename=fname;
		inode=ide;
		parent=par;
	}

	void open()
	{
		inode->open();
	}
	std::string getName()
	{
		return filename;
	}
	int getUid()
	{
		return inode->getUid();
	}

	int getType()
	{
		return inode->getType();
	}

	DiNode *getInode()
	{
		return inode;
	}

	int dellink()
	{
		return inode->dellink();
	}

	std::string read()//读出显示文件内容
	{
		inode->reset();

		std::string str;
    	HDblock *ptem=getInode()->getAddr();

		for(int i=0;;i++)
		{
			if(ptem->isFull())
			{
				if(!ptem->hasNext())
				{
					break;
				}
				ptem=ptem->getpNext();

			}

			char ch=ptem->readChar();
			if(ch<0)
			{
				return str;
			}
			else
			{
				str+=ch;
			}

		}

		return str;

	}



	int write(std::string str)//向文件中写str
	{

    	HDblock *ptem=getInode()->getAddr();

		for(int i=0;i<str.length();i++)
		{
			if(ptem->isFull())
			{
				if(!ptem->hasNext())
				{
					//p->next=hd0.getFreeBlock();
					//hd0;
				}
				ptem=ptem->getpNext();
			}

			ptem->write(str[i]);

		}

		return 1;
	}

	void setParent(Index_File*par)
	{
		parent=par;
	}

	Index_File*getParent()
	{
		return parent;
	}


	~Nfile()
	{
		delete inode;
	}



};

typedef Nfile Index_Record;



/////////////////////////////////////////////////////



class Index_File:public Nfile
{

private:
	std::vector<Index_Record*> records;


public:
	Index_File(std::string filename,HDblock*blk,int uid,Index_File *par):Nfile(filename,new DiNode(INDEXFILE,blk,uid),par)
	{
		parent=par;

	}


	Index_File(std::string filename,DiNode *ide,Index_File *par):Nfile(filename,ide,par)
	{
		parent=par;
	}

	Index_File*getParent()
	{
		return parent;
	}
	void setParent(Index_File*par)
	{
		parent=par;
	}

	void addFile(Nfile* file)
	{
		if(file->getType()==INDEXFILE)
		{
			file->setParent(this);
		}

		records.push_back(file);
	}

	void removeFile(Nfile*file)
	{
		if(file->dellink()==0)
		{
			for(std::vector<Nfile*>::iterator it=records.begin();it!=records.end();it++)
			{
				if(  (*it)->getName()  
					==  file->getName()  )
				{
					records.erase(it);
					break;
				}
			}
		}

	}

	Nfile*getByName(std::string nm)
	{
		for(std::vector<Index_Record*>::iterator it=records.begin();it!=records.end();it++)
		{
			if(((*it)->getName())==nm)
			{
				
				return *it;
			}
		}

		return NULL;

	}

	void listAllFile(std::string format="")
	{
		if(format.length()==0)//无参数
		{
			for(std::vector<Index_Record*>::iterator it=records.begin();it!=records.end();it++)
			{
				if((*it)->getType()==INDEXFILE)
				{
					std::cout<<"DIR===";
				}
				else
				{
					std::cout<<"COM===";
				}
				std::cout<<(*it)->getName()<<std::endl;
			}
		}
	}


	Index_File*cd(std::string nm)
	{
		if(nm=="..")
		{
			return parent ;
		}
		if(nm==".")
		{
			return this;
		}

		Nfile*ptem=NULL;

		if(ptem=getByName(nm))
		{
			if(ptem->getType()==INDEXFILE)
			{
				return (Index_File*)ptem;
			}
			else
			{
				//Exception("can not cd to a common file .");
				return NULL;
			}
		}
		return NULL;
	}







};


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -