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

📄 test2.cpp

📁 在Linux Red Hat下用C++设计并实现一个多用户多级目录结构的文件系统。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
   if(strcmp(iuser[cuser]->u_name,"root")!=0)
   {
     cout<<"ONLY THE ROOT CAN DELETE USER\n";
     return OK;
   }else
   {
	 //在用户系统中删除
     for(int xx=0;xx<userno;xx++)
     {
      if(iuser[xx]!=NULL)
      {
         if(strcmp(iuser[xx]->u_name,u_name)==0)
         {
           int temp=cuser;
           cuser=xx;
           logout();
           cuser=temp;
           break;
         }
      }
     }
   //在uwords中删除
   ofile *curfile;
   curfile=iopenfile.openf(rdir->o_fcb,"uwords",IFREG|IREAD|GREAD|OREAD);
   char*base=new char[curfile->o_fcb->f_fsize+1];
   iopenfile.readf(curfile->o_fcb,0,curfile->o_fcb->f_fsize,base);
   char name[12];
   for(int c=0;c<=(curfile->o_fcb->f_fsize-1)/26;c++)
   {
      for(int i=0;i<12;i++)
      {
         name[i]=base[26*c+i];
      } 
      if(strcmp(name,u_name)==0)
      { 
         for(int jj=(c+1)*26;jj<=curfile->o_fcb->f_fsize-1;jj++)
         {
            base[jj-26]=base[jj];
         }
         iopenfile.writef(curfile->o_fcb,0,curfile->o_fcb->f_fsize-26,base);
         iopenfile.closef(curfile); 
         delete[]base;
         iopenfile.closef(curfile);
         return OK;
      }
   } 
   iopenfile.closef(curfile); 
   delete[]base;
   return OK;
 }
}
//更改当前用户密码
int use::changepw(char*password)
{
   strcpy(iuser[cuser]->u_password,password);
   iuser[cuser]->u_flag=UCHG;
   return OK;
}
int use::create(char*name)
{
  if(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_mode>=IFREG)
  {
    cout<<"Please close the file first\n";
     return OK;
  }
  ofile *curfile;
  curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFREG,1);
  if(curfile!=NULL)
  {  
	 //文件存在,则返回
     iopenfile.closef(curfile);
     cout<<"THERE HAS BEEN THE FILE "<<name<<endl;
     return OK;
  }else
  {  
	 //不存在则创建
     curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,MODE);
     curfile->o_fcb->f_uid=iuser[cuser]->u_uid;
     curfile->o_fcb->f_gid=iuser[cuser]->u_gid;
     iopenfile.closef(curfile);
     return OK;
  }
} 
int use::del(char*name)
{ 
  ofile *curfile;
  curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFREG,1);
  if(curfile==NULL)
  {
	//文件不存在则,返回
    cout<<"CANNOT FIND THE FILE "<<name<<endl;
    return OK;
  }else
  {
	//存在,则调用openfile的deletef删除文件
    if(curfile->o_fcb->f_uid=='a')
    {
      cout<<"this file is system file!you cannot delete!\n";
      iopenfile.closef(curfile);
      return OK;
    }
    if(curfile->o_fcb->f_uid!=iuser[cuser]->u_uid&&iuser[cuser]->u_uid!='A')
    {
      iopenfile.closef(curfile);
      cout<<"YOU CANNOT DELETE THIS FILE\n";
       return OK;
    }
    if(iopenfile.deletef(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir],curfile)==-1)
    {
      iopenfile.closef(curfile);
    }
    return OK;
  }
} 
int use::open(char*name)
{ 
  ofile *curfile;
  curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFREG,1);
  if(curfile==NULL)
  {
	//不存在,则返回
    cout<<"CANNOT FIND THE FILE "<<name<<endl;
    return OK;
  }
  //存在打开
  return OK;
}
//关闭当前工作文件
int use::close(char*name)
{
   ofile *curfile; curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFREG,0,1);
   if(curfile==NULL)
   {
     cout<<"maybe this file has not been opened or there is not the file"<<endl;
     return OK;
   }
   iopenfile.closef(curfile); 
   iopenfile.closef(curfile); 
   return OK;
}
//读文件信息
int use::read(char*name)
{
   ofile *curfile; curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFREG,0,1);
   if(curfile==NULL)
   {
     cout<<"maybe this file has not been opened or there is not the file"<<endl;
     return OK;
   }
   iopenfile.closef(curfile); 
   if(curfile->o_fcb->f_gid!=iuser[cuser]->u_gid&&iuser[cuser]->u_uid!='A')
   { 
     cout<<"YOU CANNOT READ THIS FILE\n";
     return OK;
   }
   if(curfile->o_fcb->f_fsize==0)
   {
     return OK;
   }
   char*base=new char[curfile->o_fcb->f_fsize+1];
   iopenfile.readf(curfile->o_fcb,0,curfile->o_fcb->f_fsize,base); 
   char*buf=new char[curfile->o_fcb->f_fsize+1];
   int t=0;
   for(int u=0;u<curfile->o_fcb->f_fsize+1;u++)
   {
       buf[t]=base[u]; 
       t++;
       if(base[u]=='\0')
       {  
          cout<<buf<<endl;
          t=0;
       }
   }
    if(t!=0)
    {
      buf[t]='\0';
      cout<<buf<<endl;
    }
    delete[]base;
    delete[]buf;
}
//写文件,带参数-e和-b
int use::write(char*name)
{
   ofile *curfile; curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFREG,0,1);
   if(curfile==NULL)
   {
     cout<<"maybe this file has not been opened or there is not the file"<<endl;
     return OK;
   }
   iopenfile.closef(curfile); 
   if(curfile->o_fcb->f_uid=='a')
   {
     cout<<"this file is system file! you cannot write!"<<endl;
     return OK;
   }
   if(curfile->o_fcb->f_uid!=iuser[cuser]->u_uid&&iuser[cuser]->u_uid!='A')
   {
     cout<<"YOU CANNOT WRITE THIS FILE\n";
      return OK;
   } 
     char*base=new char[100];
     cout<<"#";
     cin.getline(base,100); 
     iopenfile.writef(curfile->o_fcb,0,strlen(base),base); 
     delete[]base; 
     return OK;       
}
//读目录信息,列文件
int use::dir()
{
   if(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_mode>=IFREG)
   {
     cout<<"Please close the file first\n";
     return OK;
   }if(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_fsize==0||iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_mode>=IFREG)
      return OK;
   char*base=new char[iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_fsize+1]; iopenfile.readf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,0,iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_fsize,base);
   char name[8];
   int f_mode;  
   int f_fsize;
   for(int d=0;d<=(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_fsize-1)/dsize;d++)
   {
     for(int s=0;s<8;s++)
     {
        name[s]=base[d*dsize+8+s];
     }
     f_mode=int((unsigned char)base[d*dsize])*256+int((unsigned char)base[d*dsize+1]);
     f_fsize=int((unsigned char)base[d*dsize+4])*16777216+int((unsigned char)base[d*dsize+5])*65537+int((unsigned char)base[d*dsize+6])*256+int((unsigned char)base[d*dsize+7]);
     cout<<setiosflags(ios::left);
     cout<<setw(20)<<name;
     cout<<setiosflags(ios::left);
     if(f_mode==IFDIR)
     {
        cout<<setw(20)<<"DIR"<<f_fsize/dsize<<" items\n";
     }else
     {
        cout<<setw(20)<<"FILE"<<f_fsize<<" bytes\n";
     }
   }
   delete[]base;
   return OK;
}
int use::makedir(char*name)
{
  if(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_mode>=IFREG)
  {
     cout<<"Please close the file first\n";
     return OK;
  }
  ofile *curfile;
  curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFDIR,1); 
  if(curfile!=NULL)
  {
	 //存在,则返回
     iopenfile.closef(curfile);
     cout<<"THERE HAS BEEN A FOLDER "<<name<<endl;
     return OK;
  }else
  {
	 //不存在,创建
     curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFDIR);
     curfile->o_fcb->f_uid=iuser[cuser]->u_uid;
     curfile->o_fcb->f_gid=iuser[cuser]->u_gid;
     iopenfile.closef(curfile);
     return OK;
  } 
} 
int use::removedir(char*name)
{
  ofile *curfile;  
  curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFDIR,1);
  if(curfile==NULL)
  {
	 //不存在,则返回
     cout<<"CANNOT FIND THE FOLDER "<<name<<endl;
     return OK;
  }else
  {
	//存在删除
    if(curfile->o_fcb->f_uid!=iuser[cuser]->u_uid&&iuser[cuser]->u_uid!='A')
    {
      cout<<"you cannot remove this dir\n";
      iopenfile.closef(curfile);
      return OK;
    }
    if(iopenfile.deletef(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir],curfile)==-1)
    {
      iopenfile.closef(curfile);
    }
    return OK; 
  }
}
int use::cdir(char*name)
{
   if(strcmp(name,"..")==0)
   {
      if(iuser[cuser]->u_cdir==0)
      {
          return OK;
      }else
      {
           iopenfile.closef(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]);
           iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]=NULL;
           iuser[cuser]->u_cdir--;
           return OK;
      }
   }
  ofile *curfile;
  curfile=iopenfile.openf(iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb,name,IFDIR,1);
  if(curfile==NULL)
  {
     cout<<"CANNOT FIND THE FOLDER "<<name<<endl;
     return OK;
  }else
  {
     if(iuser[cuser]->u_cdir==15)
     {
         return OK;
     }else
     {
         iuser[cuser]->u_cdir++;
         iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]=curfile; 
     }
  }
} 
void use::entrance()
{
   char buf[50];
   char temp[10];
   char order[10];
   char A[15];
   char B[15]; 
   for(;;)
   {
     buf[0]='\0';
     temp[0]='\0';
     order[0]='\0';
     A[0]='\0';
     B[0]='\0';
     if(cuser==-1)   //系统无用户工作时
     {
        cout<<"login:";
        cin.getline(A,15);
        if(strcmp(A,"shutdown")==0)
          break;
        cout<<"password:"; 
        cin.getline(B,15); 
        login(A,B);
     }else
     { 
         //系统有用户登陆时,命令的接受以及分析
         cout<<"["<<iuser[cuser]->u_name<<"@localhost "<<iuser[cuser]->u_ofile[iuser[cuser]->u_cdir]->o_fcb->f_name<<"]#";
         cin.getline(buf,50);
         int t=-1;
         int k=0;
         for(int i=0;i<50;i++)
         {
            if(buf[i]==' '||buf[i]=='\0')
            {
               if(t==-1)
                  continue;
               else
               {
                   if(t==0)
                   {
                      temp[k]='\0';
                      strcpy(order,temp);
                      t++;
                      if(buf[i]=='\0')
                         break;
                   }else
                   {
                      if(t!=2)
                         continue;
                      else
                      {
                         if(t==2)
                         {
                            temp[k]='\0';
                            strcpy(A,temp);
                            break;
                          }
                      }
                    }
               }
               k=0;
            }else
            {
                if(t==-1)
                  t++;
                else
                  if(t==1)
                    t++;
                temp[k]=buf[i];
                k++;
            }
         }
if(strcmp(order,"login")==0||strcmp(order,"logout")==0||strcmp(order,"cu")==0||strcmp(order,"du")==0||strcmp(order,"pw")==0||strcmp(order,"create")==0||strcmp(order,"delete")==0||strcmp(order,"open")==0||strcmp(order,"close")==0||strcmp(order,"read")==0||strcmp(order,"write")==0||strcmp(order,"dir")==0||strcmp(order,"md")==0||strcmp(order,"rd")==0||strcmp(order,"cd")==0)
       {
         if(strcmp(order,"login")==0)
         { 
             cout<<"password:";
             cin.getline(B,15);
             login(A,B);
         } 
         if(strcmp(order,"logout")==0)
         {
             logout();
         }
         if(strcmp(order,"cu")==0)
         {
             if(strcmp(iuser[cuser]->u_name,"root")!=0)
             {
                 cout<<"ONLY THE ROOT CAN CREATE USER\n";
             }else
             {
                 if(strcmp(A,"root")==0)
                 {
                     cout<<"CHANGE A NAME\n";
                 }else
                 {
                     cout<<"password:";
                     cin.getline(B,15);
                     createuser(A,B);
                 }
             } 
         }
         if(strcmp(order,"du")==0)
         {
             if(strcmp(iuser[cuser]->u_name,"root")!=0)
             {
                 cout<<"ONLY THE ROOT CAN CREATE USER\n";
             }else
             {
                 if(strcmp(A,"root")==0)
                 {
                    cout<<"CHANGE A NAME\n";
                 }else
                    deleteuser(A);
             }
          }
          if(strcmp(order,"pw")==0)
              changepw(A);
          if(strcmp(order,"create")==0)
              create(A);
          if(strcmp(order,"delete")==0)
              del(A);
          if(strcmp(order,"open")==0)
              open(A);
          if(strcmp(order,"close")==0)
              close(A);
          if(strcmp(order,"read")==0)
              read(A);
          if(strcmp(order,"write")==0) 
              write(A);
          if(strcmp(order,"dir")==0)
              dir();
          if(strcmp(order,"md")==0)
              makedir(A);
          if(strcmp(order,"rd")==0)
              removedir(A);
          if(strcmp(order,"cd")==0)
              cdir(A);
        }else
          cout<<"BAD COMMAND\n";
     } 
   }
} 



int vp=open("myfile",O_RDWR,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
int main()
{
	class use userA;
	userA.entrance();
}

⌨️ 快捷键说明

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