📄 openfile.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 + -