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

📄 openfile.h

📁 文件管理系统
💻 H
字号:
#include"fileprocess.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


class TOFile
{
public:
	TOFile();
	int BalOF();						//分配HOFile数组
	int Balpof(TUser& user);						//分配user中的Hofile指针数组
	void BreOF(int bof);				//释放HOFile数组
	bool OFCd(char* dirname,TUser& user);//设置用户
	bool OFCd__(TUser& user);//返回上一层目录
	bool OFIsFirst();					//true表示第一次进入系统
	bool OFCheckUW(char* tempuser,char* tempword,TUser& refuser);//检验用户名和密码
	bool OFCloseFile(char* fdname,TUser& user);//关闭文件
	bool OFDelDir(char* dirname,TUser& user);//删除目录
	bool OFDelFile(char* filename,TUser& user);//删除文件
	void OFDirectory(TUser& user);//遍历目录
	void NewUser(USERINFO un);//创建新用户
	bool OFCFile(char* filename,TUser& user);//创建文件
	bool OFCreateDir(char* dirname,TUser& user);//创建目录
	void OFNamei(char* filename,TUser& user){;}
	bool OFOpenFile(char* fdname,TUser& user);//打开文件
	void OFRead(char* filename,TUser& user);//读文件
	void OFSet(int flag,TUser& user,char* fname);//设置文件属性
	void OFShowUser();						//显示所有用户信息
	void OFWrite(char* filename,TUser& user);//写文件

protected:
	TFcb fcb;
	int cofile;
};


char* getpass(char* prompt)
{
 int i;
 char tmp;
 static char buf[20+1];
 printf("%s",prompt);
 for(i = 0; i < 20; i++)
 {
  tmp = getch();
  cout<<tmp;
  if(tmp == '\r')
  {
   buf[i] = '\0';
   break;
  }  
  buf[i] = tmp;
 }
 putchar('\n');
 return buf;
}



TOFile::TOFile()
{
	cofile=0;
	InitOFile();
}

int TOFile::BalOF()//分配ofile数组
{
	int i;
	for(i=0;i<FILENO;i++)
	{
		if((ofile[i].o_flag)==OFFLAG)//o_flag等于OFFLAG,则表明该变量没有被使用
			return i;
	}
	return -1;
}

int TOFile::Balpof(TUser& user)//分配user中的,ofile指针数组
{
	int i;
	for(i=0;i<5;i++)
	{
		if(user.u_ofile[i]==NULL)
			return i;
	}
	return -1;
}

void TOFile::BreOF(int bof)//释放ofile数组
{
	ofile[bof].o_flag=OFFLAG;
}

bool TOFile::OFCd(char* dirname,TUser& user)//设置目录
{
	return fcb.CD(dirname,user);
}

bool TOFile::OFCd__(TUser& user)//返回上一层目录
{
	return fcb.CD__(user);
}

void TOFile::NewUser(USERINFO un)//创建新用户
{
	fcb.WFUser(un);
}

bool TOFile::OFCloseFile(char* fdname,TUser &user)//关闭文件
{
	int i;
	for(i=0;i<5;i++)
	{
		if(user.u_ofile[i]!=NULL&&strcmp(fdname,user.u_ofile[i]->o_fcbp->f_name)==0)
		{//关闭文件,释放其占用的资源
			user.u_ofile[i]->o_fcbp->f_flag=FCBFLAG;
			user.u_ofile[i]->o_flag=OFFLAG;
			user.u_ofile[i]=NULL;
			return true;
		}
	}
	return false;
}

bool TOFile::OFCheckUW(char* tempuser,char* tempword,TUser& refuser)//检查用户名和密码
{
	return fcb.CheckUW(tempuser,tempword,refuser);
}

bool TOFile::OFCreateDir(char* dirname,TUser &user)//创建目录
{
	return fcb.CreateDir(dirname,user);
}

void TOFile::OFDirectory(TUser& user)//遍历目录
{
	fcb.Directory(user);
}

bool TOFile::OFDelDir(char* dirname,TUser& user)//删除目录
{
	return fcb.DelDir(dirname,user);
}


bool TOFile::OFDelFile(char* filename,TUser& user)//删除文件
{
	return fcb.DelFile(filename,user);
}

bool TOFile::OFIsFirst()
{
	return fcb.IsFirst();
}

bool TOFile::OFCFile(char* filename,TUser& user)//创建文件
{
	return fcb.FCFile(filename,user);
}

bool TOFile::OFOpenFile(char* fdname,TUser& user)//打开文件
{
	int bno,bnop;
	int i=0;
	Hfcb fd;
	fd=fcb.Namei(fdname,user);
	for(i=0;i<5;i++)
	{
		if(user.u_ofile[i]!=NULL)
		{
			if(fd.blkno==user.u_ofile[i]->o_fcbp->f_blkno&&fd.offset==user.u_ofile[i]->o_fcbp->f_number)//判断该文件是否已经打开
			{
				cout<<"The file have been opened!\n";
				return false;
			}
		}
	}
	bno=BalOF();
	if(bno==-1)
	{
		cout<<"Can not open so many files!\n";
		return false;
	}
	bnop=Balpof(user);
	if(bnop==-1)
	{
		cout<<"Can not open so many files!\n";
		fcb.Brefcb(bno);
		return false;
	}
	if(fcb.OpenFile(fdname,user)==true)//成功打开文件
	{


		ofile[bno].o_count=1;
		ofile[bno].o_flag=OFUSE;
		ofile[bno].o_fcbp=user.u_pdir;
		user.u_ofile[bnop]=&ofile[bno];
		return true;
	}
	else
	{//打开文件失败,释放刚才申请的资源
		fcb.Brefcb(bno);
		user.u_ofile[bnop]=NULL;
		return false;
	}
}
		

void TOFile::OFRead(char* filename,TUser& user)//读文件
{
	int i=0;
	Hfcb fd;
	fd=fcb.Namei(filename,user);//查找该文件的存储块,以存储位置来识别已经打开的同名文件是同一文件,还是不同目录下的同名文件
	for(i=0;i<5;i++)
	{
		if(user.u_ofile[i]!=NULL)
		{
			if(fd.blkno==user.u_ofile[i]->o_fcbp->f_blkno&&fd.offset==user.u_ofile[i]->o_fcbp->f_number)//判断文件是否打开
			{
				fcb.ReadFile(filename,user);
				return ;
			}
		}
	}
	if(i>=5)
		cout<<"Open the file, then you can use this command!\n";
}

void TOFile::OFSet(int flag,TUser& user,char* fname)//设置文件属性
{
	fcb.SetFile(flag,user,fname);
}

void TOFile::OFShowUser()//显示已注册用户信息
{
	fcb.ShowUser();
}

void TOFile::OFWrite(char* filename,TUser& user)//写文件
{
	int i=0;
	Hfcb fd;
	fd=fcb.Namei(filename,user);//查找该文件的存储块,以存储位置来识别已经打开的同名文件是同一文件,还是不同目录下的同名文件
	for(i=0;i<5;i++)
	{
		if(user.u_ofile[i]!=NULL)
		{
			if(fd.blkno==user.u_ofile[i]->o_fcbp->f_blkno&&fd.offset==user.u_ofile[i]->o_fcbp->f_number)//判断文件是否打开
			{
				fcb.JustWrRight(filename,user);//判断该用户是否有权限写文件
				return ;
			}
		}
	}
	if(i>=5)
		cout<<"Open the file, then you can use this command!\n";
}


class TEnter
{
public:
	TEnter();
	void Enter();						
	bool CheckUP(string tempuser,string temppw,TUser& refuser);	//确认用户名是否存在,确认密码是否正确
	bool CFile(string filename);						//创建新文件
	bool ECd(string dirname);						//设置目录
	bool ECd__();									//返回上一层目录
	bool ECloseFile(string filename);				//关闭文件
	bool ECreateDir(string dirname);			//创建目录
	void ERead(string filename);				//读文件
	void EWrite(string filename);				//写文件
	bool EDelDir(string dirname);				//删除目录
	bool EDelFile(string filename);				//删除文件
	void EDirectory();							//列文件目录
	void ESet(int flag,string fname);//设置文件属性
	bool EOpenFile(string fname);				//打开文件
	void EShowUser();							//显示用户信息
	void NewUser();							//创建新用户
	void Namei(char* filename,TUser& user);		//检找文件
//	bool IsExist(string tempuser);			//检查用户名是否存在
	void Init();							//用户登陆
	bool IsFirst();							//检查是否是第一次启动程序
	bool IsSucess();						//成功返回true

	void SToChar(string str,char* ctr);		//将string转换成char数组(8位)
	
protected:
	string User;							//存储用户名
	string Pword;							//存储密码
	bool Sucess;							//登陆成功与否的标志
	TOFile tofile;
};

TEnter::TEnter()
{
	if(IsFirst()==true)
	{
		NewUser();//创建第一个用户
	}	
	Init();//用户登陆并初始化系统参数
	
}

bool TEnter::CheckUP(string tempuser,string temppw,TUser &refuser)//检查用户和密码是否正确
{
	if(tempuser.length()<=0||temppw.length()<=0)//如果用户名或密码长度为0,则返回false
		return false;
	char tu[8],tp[8];
	int i=0;
	for(i=0;i<8;i++)
	{
		tu[i]='\0';
		tp[i]='\0';
	}
	//将用户名由string类型转化成为具有8个元素的数组
	if(tempuser.length()<8)//如果输入用户名小于8位
	{
		for(i=0;i<sizeof(tempuser);i++)
			tu[i]=tempuser[i];
	}
	else
	{//用户名大于8位,则载取前8位
		for(i=0;i<8;i++)
			tu[i]=tempuser[i];
	}
//将密码由string类型转化成为具有8个元素的数组
	if(sizeof(temppw)<8)//如果密码小于8位
	{
		for(i=0;i<temppw.length();i++)
			tp[i]=temppw[i];
	}
	else
	{//密码长度大于8位,则载取前8位
		for(i=0;i<8;i++)
			tp[i]=temppw[i];
	}
	return tofile.OFCheckUW(&tu[0],&tp[0],refuser);//调用下层函数,进行用户名和密码的判断
}

bool TEnter::CFile(string filename)//创建文件
{
	if(filename.length()==0)
		return false;
	char name[8];
	SToChar(filename,name);//将文件名转化为合法的格式
	user[fun].u_error=IWRITE;//利用u_error存储所以创建文件的属性
	if((tofile.OFCFile(&name[0],user[fun]))==true)
		return true;
	else
		return false;
}

bool TEnter::ECd(string dirname)//设置目录
{
	if(dirname.length()<=0)
	{
		cout<<"Can not find the DIR!\n";
		return false;
	}
	char name[8];
	TEnter::SToChar(dirname,name);//将目录名转化为合法的格式
	if(tofile.OFCd(name,user[fun])==true)
		return true;
	else
		return false;
}

bool TEnter::ECd__()//返回上一层目录
{
	return tofile.OFCd__(user[fun]);
}

bool TEnter::ECloseFile(string filename)//关闭文件
{
	if(filename.length()<=0)
		return false;
	char name[8];
	SToChar(filename,name);//将文件名格式化
	if((tofile.OFCloseFile(&name[0],user[fun]))==true)//调用低层函数,关闭该文件
		return true;
	else
		return false;
}

bool TEnter::ECreateDir(string dirname)//创建目录。
{
	if(dirname.length()<=0)
		return false;
	char name[8];
	SToChar(dirname,name);//格式化目录名
	user[fun].u_error=IFDIR;
	if((tofile.OFCreateDir(&name[0],user[fun]))==true)
		return true;
	else
		return false;
}

bool TEnter::EDelDir(string dirname)//删除目录
{
	if(dirname.length()<=0)
		return false;
	char name[8];
	SToChar(dirname,name);//格式化目录名
	if((tofile.OFDelDir(&name[0],user[fun]))==true)
		return true;
	else
		return false;
}

bool TEnter::EDelFile(string filename)//删除文件
{
	if(filename.length()<=0)
		return false;
	char name[8];
	SToChar(filename,name);//格式化文件名
	if((tofile.OFDelFile(&name[0],user[fun]))==true)
		return true;
	else
		return false;
}

void TEnter::EDirectory()//遍历目录
{
	tofile.OFDirectory(user[fun]);
}

bool TEnter::EOpenFile(string fname)//打开文件
{
	if(fname.length()<=0)
	{
		cout<<"Can not find the file!\n";
		return false;
	}
	char name[8];
	SToChar(fname,name);//格式化文件名
	return tofile.OFOpenFile(name,user[fun]);
}


void TEnter::ERead(string filename)//读文件
{
	if(filename.length()<=0)
	{
		cout<<"Can not find the file!\n";
		return ;
	}
	char name[8];
	TEnter::SToChar(filename,name);//格式文件名
	tofile.OFRead(name,user[fun]);
}
void TEnter::ESet(int flag,string fname)//设置文件属性
{
	if(fname.length()<=0)
	{
		cout<<"Can not find the file!\n";
		return ;
	}
	char name[8];
	SToChar(fname,name);//格式化文件名
	tofile.OFSet(flag,user[fun],name);
}

void TEnter::EShowUser()//显示已注册用户信息
{
	tofile.OFShowUser();
}

void TEnter::EWrite(string filename)//写文件
{
	if(filename.length()<=0)
	{
		cout<<"Can not find the file!\n";
		return ;
	}
	char name[8];
	TEnter::SToChar(filename,name);//格式化文件名
	tofile.OFWrite(name,user[fun]);
}

bool TEnter::IsFirst()
{
	return tofile.OFIsFirst();
}

void TEnter::Init()//用户登陆
{
	string username;
	string password;
	int count=0;
	while(1)
	{
		if(count>=3)
			exit(0);
		cout<<"login: ";
		cin>>username;
		password=getpass("password: ");
		count++;
		if(CheckUP(username,password,user[fun])==true)//验证用户名和密码
		{
			cout<<"\n恭喜! "<<   username<<"! 您可以输入命令: \"help\" 来查看帮助文件!\n\n";

	cout<<setiosflags(ios::left)<<endl<<endl
		<<setw(13)<<"命令"<<setw(13)<<"说明"<<setw(17)<<"    格式"<<endl
		<<setw(13)<<"new"<<setw(13)<<"新建新用户"<<setw(17)<<"    new"<<endl
		<<setw(13)<<"user"<<setw(13)<<"显示用户清单"<<setw(17)<<"    user"<<endl
		<<setw(13)<<"catcon"<<setw(13)<<"新建文件"<<setw(17)<<"    catcon [filename]"<<endl
        <<setw(13)<<"write"<<setw(13)<<"写文件"<<setw(17)<<"    write [filename]"<<endl
		<<setw(13)<<"more"<<setw(13)<<"读文件"<<setw(17)<<"    more [filename]"<<endl
		<<setw(13)<<"delete"<<setw(13)<<"删除文件"<<setw(17)<<"    delete [filename]"<<endl	
		<<setw(13)<<"chmod"<<setw(13)<<"改变属性"<<setw(17)<<"    chmod [filename]"<<endl
        <<setw(13)<<"dir"<<setw(13)<<"显示目录"<<setw(17)<<"    dir"<<endl
		<<setw(13)<<"cd"<<setw(13)<<"改变路径"<<setw(17)<<"    cd [dirname]"<<endl
		<<setw(13)<<"cd~"<<setw(13)<<"反回上一级"<<setw(17)<<"    cd~"<<endl
		<<setw(13)<<"md"<<setw(13)<<"新建文件夹"<<setw(17)<<"    md [dirname]"<<endl
		<<setw(13)<<"rd"<<setw(13)<<"删除文件夹"<<setw(17)<<"    rd [dirname]"<<endl
		<<setw(13)<<"help"<<setw(13)<<"显示帮助"<<setw(17)<<"    help"<<endl
		<<setw(13)<<"logout"<<setw(13)<<"注消"<<setw(17)<<"    logout"<<endl<<endl<<endl;
			break;
		}
		else
		{
			cout<<"登录失败!\n";
			continue;
		}

	}
}

void TEnter::Namei(char* filename,TUser& user)//检找文件目录结构
{
	tofile.OFNamei(filename,user);
}

void TEnter::NewUser()//新建用户
{
	string tuser;//存储用户名
	string tword1;//存储第一次输入密码
	string tword2;//存储第二次输入密码、
	char uid='\0';
	int i;
	USERINFO un;
	
	cout<<"您是第一个用户!请先注册:\n\n";
	
        while(1)
	{		
		cout<<"用户名: ";
		cin>>tuser;
		tword1=getpass("密码: ");
		tword2=getpass("再次输入密码: ");
		if(tword1==tword2)//检查两次密码输入是否相符
		{
			cout<<"请输入您的用户组ID: ";
			cin>>uid;
			un.d_flag=1;
			un.d_uid=uid;
			un.d_gid=(tuser[0]+tuser[1])/2;
			for(i=0;i<8;i++)
			{
				un.d_name[i]='\0';
				un.password[i]='\0';
			}
			if(sizeof(tuser)<8)//格式化用户名
			{
				for(i=0;i<tuser.length();i++)
					un.d_name[i]=tuser[i];
			}
			else
			{
				for(i=0;i<8;i++)
					un.d_name[i]=tuser[i];
			}
			//格式化密码
			if(sizeof(tword1)<8)
			{
				for(i=0;i<tuser.length();i++)
					un.password[i]=tword1[i];
			}
			else
			{
				for(i=0;i<tword1.length();i++)
					un.password[i]=tword1[i];
			}
			tofile.NewUser(un);
			cout<<"新用户注册成功!\n\n"<<endl;

			break;
		}
		else
		{
			cout<<"密码不一致!\n\n"<<endl;
			continue;
		}
	}
}

void TEnter::SToChar(string str,char* ctr)//将string类型转换成,具有8元素的字符数组
{
	int i=0;
	for(i=0;i<8;i++)
	{
		ctr[i]='\0';
	}
	if(str.length()<8)
	{
		for(i=0;i<str.length();i++)
			ctr[i]=str[i];
	}
	else
	{
		for(i=0;i<8;i++)
			ctr[i]=str[i];
	}
}

⌨️ 快捷键说明

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