#include <bits/stdc++.h> #define getb(type) (type*)malloc(sizeof(type)) using namespace std; const int manx=10010; string fileaddr[110][110];//索引表,存放文件目录和二级文件的地址 string fileinfo[10010];//文件名 char usernowname[10];//全局变量,当前用户名 char usernowpath[200] = "\\\0"; int usernowpride;//全局变量,当前用户类型 int nowlevel; //全局变量,当前目录层次 bool createuser(); struct user //用户类型定义 { char name[10];//用户名 char pass[10];//用户密码 int pride;//用户权限,1为管理员,0为普通用户 }; void linux_cd(string str1,string str2,string str3); void linux_mkdir(string str1,string str2,string str3); void linux_ls(string str1,string str2,string str3); void chomd(string str1,string str2,string str3); void linux_remove(string str1,string str2,string str3); void linux_cd2(string str1,string str2,string str3);//文件返回上一层 bool login();//用户登陆 bool login()//用户登陆 { char name[10]; char pass[10]; cout<<"Login:"; cin>>name; cout<<endl; cout<<"password:"; cin>>pass; if((strcmp("root",name)==0)&&(strcmp("123456",pass)==0))//管理员 { usernowpride = 1; strcpy(usernowname,"root"); return true; } FILE *fp=NULL; struct user actuser; if(!(fp=fopen("user","ab+"))) //ab+ 以二进制方式打开,并在原内容后追加 { cout<<"Error:用户表错误\n"; return false; } rewind(fp); //将文件指针重新指向文件的开头 while(!feof(fp)) //判断指针是否已经到达文件的尾部 { fread(&actuser,sizeof(struct user),1,fp); //把user里的数据读入到actuser中 if((strcmp(actuser.name,name)==0)&&(strcmp(actuser.pass,pass)==0)) { usernowpride = actuser.pride;//记录当前用户的权限 strcpy(usernowname,actuser.name);//记录当前用户的主路径 nowlevel=-1;//记录当前目录层次 fclose(fp); //设置路径 if(strcmp(usernowpath,"\\")!=0) //不是根目录就添加斜杠 strcat(usernowpath,"\\"); strcat(usernowpath,usernowname); return true; } } cout<<"Error:用户名或密码无效,请核对后再输入\n"; fclose(fp); return false; } void linux_ls(string str1,string str2,string str3){ if(str3=="/"){ int te=0; for(int i=1;i<=100;i++){ if(fileaddr[i][0]!=""){ cout<<fileaddr[i][0]<<" "; te++; } if(te%5==0&&te!=0){ cout<<endl; } } cout<<endl; }else{ int index=-1; for(int i=1;i<=100;i++){ if(fileaddr[i][0]==str3){ index=atoi(fileaddr[i][1].c_str()); break; } } if(index==-1){ cout<<str3<<"文件不存在"<<endl; }else{ int i=index*100+1; int te=0; for(int t=i;t<=(index+1)*100;t++){ if(fileinfo[t]!=""){ cout<<fileinfo[t]<<" "; te++; } if(te%5==0&&te!=0){ cout<<endl; } } } cout<<endl; } } void linux_cd(string str1,string str2,string str3){ if(str3=="/"){ string cmd[3]; while(1){ cout<<"["<<usernowname<<"#"<<str2<<"]"<<">>>"; cin>>cmd[0]>>cmd[1]>>cmd[2]; chomd(cmd[0],cmd[1],cmd[2]); } }else{ cout<<"Error"<<endl; } } void linux_mkdir(string str1,string str2,string str3){ if(str3=="/"){ //表示根目录 int flag=0; for(int i=1;i<=100;i++){ if(fileaddr[i][0]==str2){ flag=1;break; } } if(flag==1){cout<<"文件已经存在"<<endl; }else{ int i=1; while(1){ if(fileaddr[i][0]==""){ fileaddr[i][0]=str2; fileaddr[i][1]=i; cout<<str2<<" "<<i<<endl; break; }else{i++;} } } }else{ //此时代表的是二级目录 int index=0; for(int i=1;i<=100;i++){ if(fileaddr[i][0]==str3){ index=atoi(fileaddr[i][1].c_str()); break; } } int i=index*100+1; while(1){ if(fileinfo[i]==""&&i<=(index+1)*100){ fileinfo[i]=str2; break; }else{ if(i>(index+1)*100) cout<<"越界"<<endl; i++; } } } } void linux_remove(string str1,string str2,string str3){ if(str3=="/"){ int flag=0; for(int i=1;i<=100;i++){ if(fileaddr[i][0]==str2){ flag=1;fileaddr[i][0]=""; break; } } if(flag==1){ cout<<str2<<"文件删除成功"<<endl; }else{ cout<<"不存在"<<str2<<"文件"<<endl; } }else{ int index=-1; for(int i=1;i<=100;i++){ if(fileaddr[i][0]==str3){ index=atoi(fileaddr[i][1].c_str()); break; } } cout<<index<<" "<<str3<<endl; if(index==-1) cout<<str3<<"文件不存在"<<endl; else{ int i=index*100+1; int te=0; for(int t=i;t<=(index+1)*100;t++){ if(fileinfo[t]==str2){ fileinfo[t]="";break; } } } } } void linux_cd2(string str1,string str2,string str3){ if(str1=="cd/"&&str2=="/"&&str3=="/"){ string cmd[3]; while(1){ cout<<"["<<usernowname<<"#]>>>"; cin>>cmd[0]>>cmd[1]>>cmd[2]; chomd(cmd[0],cmd[1],cmd[2]); } }else{ cout<<"Error"<<endl; } } void chomd(string str1,string str2,string str3){ if(str1=="cd"&&str2!=""&&str3!=""){ linux_cd(str1,str2,str3); }else if(str1=="mkdir"&&str2!=""&&str3!=""){ linux_mkdir(str1,str2,str3); }else if(str1=="ls"&&str2!=""&&str3!=""){ linux_ls(str1,str2,str3); }else if(str1=="remove"&&str2!=""&&str3!=""){ linux_remove(str1,str2,str3); }else if(str1=="cd/"){ linux_cd2(str1,str2,str3); }else if(str1=="useradd"&&str2=="username"&&str3!=""){ createuser(); } } int main() { while(1){ system("cls"); while(1) if(login())//判断用户是否登录 break; //默认的管理账号密码是root 123456.用户账号可以进行相应的操作 if(strcmp(usernowname,"root")==0){ system("cls"); string cmd[3]; while(1){ cout<<"["<<usernowname<<"#]>>>"; cin>>cmd[0]>>cmd[1]>>cmd[2]; chomd(cmd[0],cmd[1],cmd[2]); } }else{ system("cls"); string cmd[3]; while(1){ cout<<"["<<usernowname<<"#]>>>"; cin>>cmd[0]>>cmd[1]>>cmd[2]; chomd(cmd[0],cmd[1],cmd[2]); } } } return 0; } //新建用户 bool createuser() { struct user newuser; char name[10]; char pass[10]; int pride; if(usernowpride!=1) { cout<<"当前用户没有新建用户的权限\n"; return false; } FILE *fp; if((fp = fopen("user","ab+"))==NULL) { cout<<"用户表打开失败\n"; return false; } else { cout<<"请输入用户名:"; cin>>name; if(strcmp(name,"root")==0) { printf("Error:此为超级管理员\n"); return false; } rewind(fp); while(!feof(fp)) { fread(&newuser,sizeof(struct user),1,fp); if(strcmp(newuser.name,name)==0) { cout<<"该用户名已经存在\n"; fclose(fp); return false; } } cout<<"请输入用户密码:"; cin>>pass; cout<<"请输入用户权限(0普通用户,1管理员):"; cin>>pride; strcpy(newuser.name,name); strcpy(newuser.pass,pass); newuser.pride=pride; //为新建用户建立用户目录文件 if(!fopen(newuser.name,"ab+")) { cout<<"用户创建失败\n"; //如创建失败则把已经建立的用户目录删除 char cmd[20] = "DEL "; strcat(cmd,newuser.name); system(cmd); fclose(fp); return false; } if(!fwrite(&newuser,sizeof(struct user),1,fp)) { cout<<"创建失败\n"; fclose(fp); return false; } else { cout<<"用户创建成功\n"; fclose(fp); return true; } } }