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

📄 base.cpp

📁 实现功能(以下命令全部了小写) ls 显示文件目录 chmod 改变文件权限 chown 改变文件拥有者 chgrp 改变文件所属组 pwd 显示当前目录 cd 改变当
💻 CPP
字号:
#include"base.h"
#include<math.h>
#include   <conio.h>   
#include   <cstdlib>   

//*********************************************************************
string dirfile="dir.txt";
string supbkfile="supbk.txt";
string inodefile="inode.txt";
string usrfile="usr.txt";
string unixdisk="unix.txt";
//*********************************************************************
string inttochar(int num)
{
	string s;
	if(num<10)
	{
		s='0';
		s+=(char)(num+48);
		return s;
	}
    else if(num<100&&num>=10)
	{
	    s=(char)(num/10+48);
	    s+=(char)(num%10+48);
	    return s;
	}
	else if(num<1000&&num>=100)
	{
	
	    s=(char)(num/100+48);
	    s+=(char)(num%100/10+48);
	    s+=(char)(num%100%10+48);
	    return s;
	}
	return s;
}
int stringtoint(string s)
{
	int temp=0;
	int i;
	int t=s.length();
	int k=t;
	for(i=0;i<t;i++)
	{
		temp=temp+(((int)s[i])-48)*pow(10,k-1);
		k--;
	}
	return temp;
}
////////////////////////////////////////////////////////////////
void writeusr(usr u)
{
    ofstream out;
	out.open(usrfile.c_str(),ios::app);
	out<<u.usrname<<" "<<u.password<<" "<<u.uid<<u.gid<<endl;
	out.close();
}
void writeinode(inode ind)
{
     ofstream out;
	 out.open(inodefile.c_str(),ios::app);
	 out<<ind.i_num<<" "<<ind.uid<<" "<<ind.gid<<" "<<ind.size<<" "<<ind.links<<" "<<ind.mode<<" "<<ind.ctime<<" "<<ind.lctime
		 <<" "<<ind.di_addr[0]<<" "<<ind.di_addr[1]<<" "<<ind.di_addr[2]<<" "<<ind.di_addr[3]<<" "<<ind.di_addr[4]<<" "<<ind.di_addr[5]
		 <<" "<<ind.di_addr[6]<<" "<<ind.di_addr[7]<<" "<<ind.di_addr[8]<<" "<<ind.di_addr[9]<<endl;
     out.close();
}
void writedir(dir di)
{
	 ofstream out;
	 out.open(dirfile.c_str(),ios::app);
	 out<<di.fatherid<<" "<<di.dirname<<" "<<di.id<<" "<<di.nid<<endl;
     out.close();
}
string gettime()
{
	string s,s1;
	time_t t;
	time(&t);
	s=ctime(&t);
	s1=s.substr(4,3);
	s1+='#';
	s1+=s.substr(8,2);
	s1+='#';
	s1+=s.substr(11,8);
	s1+='#';
	s1+=s.substr(20,4);
	return s1;
}
void initinod(inode &ind,int i_n,int ud,int gd,int si,int link,
   int addr[],
   string mod,
   string ct,
   string lct)
{
	int i;
	ind.i_num=i_n;
	ind.uid=ud;
	ind.gid=gd;
	ind.mode=mod;
	ind.links=link;
	ind.size=si;
	ind.ctime=ct;
	for(i=0;i<10;i++)
	ind.di_addr[i]=addr[i];
	ind.lctime=lct;
}
/////////////////////////////////////////
////////////////
dir finddir(string sdir)
{
	dir d;
    ifstream in;
	in.open(dirfile.c_str());
	while(!in.eof())
	{
		in>>d.fatherid>>d.dirname>>d.id>>d.nid;
		if(d.dirname==sdir)
			break;
	}
	in.close();
	return d;
}
void deletedir(string sdir)
{
	Stack<dir> stdir;
	dir newdir1 ,newdir2;
	finddir(sdir);
	ifstream in;
	in.open(dirfile.c_str());
	while(!in.eof())
	{
		in>>newdir1.fatherid>>newdir1.dirname>>newdir1.id>>newdir1.nid;
        stdir.push(newdir1);
		if(newdir1.dirname==sdir)
			newdir2=newdir1;
	}
	in.close();
	ofstream out;
	out.open(dirfile.c_str());
	stdir.pop();
	while(!stdir.StackEmpty())
	{
		if(stdir.Peek().id==newdir2.id||(stdir.Peek().fatherid==newdir2.id))
			stdir.pop();
		else
		{
			out<<stdir.Peek().fatherid<<" "<<stdir.Peek().dirname<<" "<<stdir.Peek().id<<" "<<stdir.Peek().nid<<endl;
			stdir.pop();
		}
	}
	out.close();
}
////////////////////////////////////////////////////////////////
bool login(string loginfile)
{
	usr u;
	ifstream in;
	in.open(loginfile.c_str());
	in>>u.usrname>>u.password>>u.uid>>u.gid;
	in.close();
	string username,pwd;
	cout<<"please enter the username:";
	cin>>username;
	cout<<"please enter the password:";
{   
  char   psw[256];   
  char   ch;   
  int   pos=0;   
  while   ((ch=getch())!='\r')   
  {   
  if   (ch=='\b')   
  {   
  pos--;   
  if   (pos<0)   
  {   
  pos=0;   
  continue;   
  }   
  cout<<"\b \b";   
  }   
  else   
  {   
  if   (pos<255)   
  {   
  psw[pos++]=ch;   
  cout<<'*';   
  }   
  }   
  }
  psw[pos]='\0'; 
pwd=psw;
cout<<"\n"; }


   
	if((username==u.usrname)&&(pwd==u.password))
		return true;
	else
		return false;

}
void load(string filename,Stack<int> &Sinode,Stack<int> &Sdisk,Stack<int> &Sdirid)
{
	int i,t;
	ifstream in;
	in.open(filename.c_str());
	for(i=0;i<5;i++)
		in>>t;
	for(i=5;i<80;i++)
	{
		in>>t;
		if(t>0)
			Sinode.push(t);
	}
	for(i=0;i<3;i++)
		in>>t;
    for(i=0;i<100;i++)
	{
		in>>t;
		if(t>0)
			Sdisk.push(t);
	}
    for(i=0;i<5;i++)
       in>>t;
	for(i=0;i<32-5;i++)
	{
		in>>t;
		if(t>0)
			Sdirid.push(t);
		  
	}
	in.close();
	/*inode ind;
	string s=gettime();
	int addr[10]={0,0,0,0,0,0,0,0,0,0};
	for(i=1;i<=5;i++)
	{
	   
	   initinod(ind,i,1,1,0,1,addr,"drwx",s,s);
       writeinode(ind);
	}*/
}
void deleteinode(int id)
{
	Stack<inode> Sid;
	inode newi1;
	ifstream in;
	in.open(inodefile.c_str());
	while(!in.eof())
	{
         in>>newi1.i_num>>newi1.uid>>newi1.gid>>newi1.size>>newi1.links>>newi1.mode>>newi1.ctime>>newi1.lctime>>newi1.di_addr[0]>>newi1.di_addr[1]>>newi1.di_addr[2]>>newi1.di_addr[3]>>newi1.di_addr[4]>>newi1.di_addr[5]>>newi1.di_addr[6]>>newi1.di_addr[7]>>newi1.di_addr[8]>>newi1.di_addr[9];  
		 if(newi1.i_num!=id)
		    Sid.push(newi1);
	}
	in.close();
	ofstream out;
	out.open(inodefile.c_str(),ios::trunc);//清空原文件
    out.close();
	//cout<<"Sid.recount()1:"<<Sid.recount()<<endl;
	newi1=Sid.pop();//why/***************************************/
	//cout<<"Sid.recount()2:"<<Sid.recount()<<endl;
	writeinode(newi1);
	//cout<<"Sid.recount()3:"<<Sid.recount()<<endl;
    while(!Sid.StackEmpty())
		writeinode(Sid.pop());
}
void wlockFBStacktf(int num)
{
	ifstream in;
	in.open(supbkfile.c_str());
	int i;
	int array[215];
	for(i=0;i<215;i++)
		in>>array[i];
	in.close();
	array[186]=num;
	ofstream out;
	out.open(supbkfile.c_str());
	for(i=0;i<215;i++)
		out<<array[i]<<endl;
	out.close();

}
void wlockFIBStacktf(int num)
{
	ifstream in;
	in.open(supbkfile.c_str());
	int i;
	int array[215];
	for(i=0;i<215;i++)
	{
		in>>array[i];
	}
	in.close();
	array[187]=num;
	ofstream out;
	out.open(supbkfile.c_str());
	for(i=0;i<215;i++)
		out<<array[i]<<endl;
	out.close();
}
void wfreeIBlockNtf(int num)
{
	ifstream in;
	in.open(supbkfile.c_str());
	int i;
	int array[215];
	for(i=0;i<215;i++)
		in>>array[i];
	in.close();
	array[81]=num;
	ofstream out;
	out.open(supbkfile.c_str());
	for(i=0;i<215;i++)
		out<<array[i]<<endl;
	out.close();
}
void wfreeBlockNtf(int num)
{
	ifstream in;
	in.open(supbkfile.c_str());
	int i;
	int array[215];
	for(i=0;i<215;i++)
		in>>array[i];
	in.close();
	array[184]=num;
	ofstream out;
	out.open(supbkfile.c_str());
	for(i=0;i<215;i++)
		out<<array[i]<<endl;
	out.close();
}
void winodeid(int flag,int num)//0 --分配,1--回收
{
	ifstream in;
	in.open(supbkfile.c_str());
	int i;
	int array[215];
	for(i=0;i<215;i++)
		in>>array[i];
	in.close();
	if(flag==1)
	  array[num-1]=num;
	if(flag==0)
		array[num-1]=0;
	ofstream out;
	out.open(supbkfile.c_str());
	for(i=0;i<215;i++)
		out<<array[i]<<endl;
	out.close();
}
void wdiskid(int flag,int num)
{
	ifstream in;
	in.open(supbkfile.c_str());
	int i;
	int array[247];
	for(i=0;i<247;i++)
		in>>array[i];
	in.close();
	if(flag==1)
	   array[83+num-1]=num;
	if(flag==0)
       array[83+num-1]=0;
	ofstream out;
	out.open(supbkfile.c_str());
	for(i=0;i<247;i++)
		out<<array[i]<<endl;
	out.close();
}
void wdirid(int flag,int num)
{
	ifstream in;
	in.open(supbkfile.c_str());
	int i;
	int array[215];
	for(i=0;i<215;i++)
		in>>array[i];
	in.close();
	if(flag==1)
	    array[183+num]=num;
	if(flag==0)
		array[183+num]=0;
	ofstream out;
	out.open(supbkfile.c_str());
	for(i=0;i<215;i++)
		out<<array[i]<<endl;
	out.close();
}
int  rlockFIBStackff()
{
     int t;
	 ifstream in;
	 in.open(supbkfile.c_str());
	 for(int i=0;i<188;i++)
		 in>>t;
	 in.close();
	 return t;
}
int  rlockFBStackff()
{
	 int t;
	 ifstream in;
	 in.open(supbkfile.c_str());
	 for(int i=0;i<187;i++)
		 in>>t;
	 in.close();
	 return t;
}
////////////////////////////////////////////////////////////////////
bool ialloc(Stack<int> &st,int &it,int addr[])
{
     int t;
	 t=rlockFIBStackff();
	 if(t==1)
	 {
		 cout<<"超级块上锁,不能访问!"<<endl;
		 return false;
	 }
	 else
	 {
		 wlockFIBStacktf(1);//zhi chao ji kuai suo
		 if(st.StackEmpty())
		 {
			 cout<<"I 节点栈为空!"<<endl;
			 wlockFIBStacktf(0);
			 return false;
		 }
		 else
		 {
           it=st.pop();
		   //winodeid(0,it);
		   wlockFIBStacktf(0);//qu xiao chao ji kuai suo
		   inode newd;
		   string ct,lct; 
		   ct=gettime();lct=ct;
		   //int addr[10]={0,0,0,0,0,0,0,0,0,0};
		   initinod(newd,it,1,1,0,1,addr,"drwx",ct,lct);
		   writeinode(newd);
		   
		   return true;
		 }
	 }

}
bool diskalloc(Stack<int> &st,int &it)
{
	 int t;
	 t=rlockFBStackff();
	 if(t==1)
	 {
		 cout<<"超级块上锁,不能访问!"<<endl;
		 return false;
	 }
	 else
	 {
		 wlockFIBStacktf(1);//zhi chao ji kuai suo
		 if(st.StackEmpty())
		 {
			 cout<<"磁盘块号栈为空!"<<endl;
			 wlockFBStacktf(0);
			 return false;
		 }
		 else
		 {
           it=st.pop();
		   //wdiskid(0,it);
		   wlockFIBStacktf(0);//qu xiao chao ji kuai suo
		   return true;
		 }
	 }
}

dir finddir(int fatherid)
{
	dir d;
    ifstream in;
	in.open(dirfile.c_str());
	while(!in.eof())
	{
		in>>d.fatherid>>d.dirname>>d.id>>d.nid;
		if(d.fatherid==fatherid)
			break;
	}
	in.close();
	return d;
}

inode findinode(int num)
{
    inode ind;
    ifstream in;
	in.open(inodefile.c_str());
	while(!in.eof())
	{
		in>>ind.i_num>>ind.uid>>ind.gid>>ind.size>>ind.links>>ind.mode>>ind.ctime>>ind.lctime
		 >>ind.di_addr[0]>>ind.di_addr[1]>>ind.di_addr[2]>>ind.di_addr[3]>>ind.di_addr[4]>>ind.di_addr[5]
		 >>ind.di_addr[6]>>ind.di_addr[7]>>ind.di_addr[8]>>ind.di_addr[9];
		if(ind.i_num==num)
			break;
	}
	in.close();
	return ind;
}
int calculate(int size,int bnum)
{
	int num1,num2;
	num1=size/bnum;num2=size%bnum;
	if(num2>0)
		num1++;
	return num1;
       
}

⌨️ 快捷键说明

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