代码

#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;
		}
	}
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲游山河十万里

你的鼓励是我们创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值