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

📄 filesever.cpp

📁 用C实现的本地服务器
💻 CPP
字号:
/***
*
*filesever.cpp - 与命令处理相关的函数
*
*   编写者:王慧松、李拓
*
*   完成时间:2008年11月14日
*
*   修改时间:
*
*
****/
#include "StdAfx.h"
#include "Head.h"


//显示命令提示符(登陆后),调用Severroot函数
void Cmdcursor(char *username)
{
	int i;
	char severroot[255];                     //文件服务器根路径在操作系统的路径
	char dirnow[255];                        //当前操作系统的路径
	Severroot(severroot,username); 
	getcwd(dirnow,255);
	if (strcmp(severroot,dirnow)==0)         //当前路径为根路径
	{
		printf("\n%s@~>",username);
	}
	else
	{
		for (i=strlen(dirnow)-1;i>=0;i--)
		{
			if (dirnow[i]=='\\')
			{
				break;
			}
		}
		strcpy(dirnow,dirnow+i+1);
		printf("\n%s@%s>",username,dirnow);			
	}
}

//欢迎界面
void Welcome()
{
	printf("\n");
	printf(" ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~\n");
	printf("          >>>>>>>>>>>>>>>欢迎使用本地文件服务器<<<<<<<<<<<<<<<\n");
	printf("\n\n\n\n");
	printf("\t\t软件版本:v1.00\n\n\n");
	printf("\t\t作者:李拓  杨金锋  王慧松\n\n");
	printf("\t\t      电信0705班    Idea团队\n\n\n");
	printf("\t\t联系方式:lituo16@gmail.com\n\n\n\n\n");
	printf("\t\t>>>>>>>>>>>>>>>祝您使用愉快<<<<<<<<<<<<<<<\n\n");
	printf(" ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~\n");
	printf("按任意键进入本系统...");
	getch();
	system("cls");
}

//启动文件服务器的初始化函数
void Initial()
{
	FILE * pFile;
	if(mkdir("fileserver")==-1)                 //fileserver文件夹已存在
	{
		chdir("fileserver");
		return;
	}
	chdir("fileserver");
	if ( (pFile=fopen("userinformation.txt","wt+")) == NULL) 
		printf("初始化出现错误\n");
	fputs("public",pFile);
	fputs("\n",pFile);
	fputs("123456",pFile);
	fputs("\n",pFile);
	fclose(pFile);
	mkdir("public");
}

//登录前的命令等待函数
void waiting()
{
	unsigned int i;
	char basic_able_cmd[][20]={"login","register","help","quit"};
	char basic_unable_cmd[][20]={"logout","upload","download","delete","list","find","mkdir","rmdir","cd"};
	char user_cmd[50];
	char pre_cmd[20];
	
	while(1)
	{
		int choice=0;
		printf(">");
		i=0;
		fflush(stdin);
		gets(user_cmd);
		Del_blank(user_cmd);
		while ((user_cmd[i]!=' ')&&(user_cmd[i]!='\0'))
		{
			pre_cmd[i]=user_cmd[i];
			i++;
		}
		pre_cmd[i]='\0';
		
		for (i=0;i<strlen(pre_cmd);i++)             //大写变为小写
		{
			pre_cmd[i]=tolower(pre_cmd[i]);
		}

		if (pre_cmd[0]=='\0')	continue;           //只输入回车

		for(i=0;i<4;i++)
		{
			if (!strcmp(pre_cmd,basic_able_cmd[i]))
			{
				choice=i+1;
			}
		}
		if (choice!=0)
			user_action(choice,user_cmd);           //进入用户界面
		else
		{
			for (i=0;i<9;i++)
			{
				if(!strcmp(pre_cmd,basic_unable_cmd[i]))
				{
					printf("您还未登录,请先登陆\n");
					i=10;
				}
			}
			if(i==9)	printf("无效的命令,请参阅帮助\n");
		}
	}
}

//判断输入的用户名是否合法
int Inputname(char *username)
{
	unsigned i;
	char a;
	if (strlen(username)>28)
	{
		printf("用户名不能超过28字符\n");
		return 0;
	}
	for (i=0;i<strlen(username);i++)
	{
		a=username[i];
		if (!((a>=48&&a<=57)||(a>=65||a<=90)||a==95||(a>=97&&a<=122)))
		{
			printf("用户名只能包括数字、字母和下划线\n");
			return 0;
		}
	}
	return 1;
}

//登录前的命令响应函数
void user_action(int choice,char * full_cmd)
{
	devide  pt;
	char F_cmd[100];
	char para[2][50];
	char dirnow[255];                          //获取当前目录
	char newusername[MAX_USERNAME];
	int i=0;
	unsigned j;
	int iflogin;                               //记录Register函数或Login函数的返回值
	getcwd(dirnow,255);
	strcpy(F_cmd,full_cmd);
	pt=basic_cmddev(F_cmd);
	while(i++<2)
		strcpy(para[i-1],pt.re_para[i-1]);
	if(pt.flag==-1)
		printf("参数错误,请重新输入\n");
	else
	{
		
		switch (choice)
		{
		case 1:	
			if (pt.flag==1&&Inputname(para[0]))
			{
				iflogin=Login(para[0]);
				if (iflogin)
				{
					if (IfmatchA(dirnow,para[0])!=0)
					{
						printf("很抱歉,您将文件服务器移动了位置,导致您的注册信息失效,");
						printf("请更改您的用户名\n输入新用户名:");
						fflush(stdin);
						gets(newusername);
						iflogin=Register(newusername);
						if (iflogin)
						{
							if (rename(para[0],newusername)==0)   //重命名文件夹成功
							{
								chdir(newusername);
								Cmdwait(newusername);
							}
							else
							{
								printf("系统出现错误!请重新注册\n");
							}
						}

					} 
					else
					{
						chdir(para[0]);
						Cmdwait(para[0]);
					}
				
				}
			}
			else
			{
				printf("用户名不存在\n");
			}
			break;
		case 2:
			if (pt.flag==1&&Inputname(para[0]))
			{
				if (IfmatchA(dirnow,para[0])!=0)
				{
					printf("您输入的用户名不合法\n");
				} 
				else
				{
					iflogin=Register(para[0]);
					if (iflogin)
					{
						if (mkdir(para[0])==0)                  //创建文件夹成功
						{
							chdir(para[0]);
							Cmdwait(para[0]);
						}
						else
						{
							printf("系统出现错误!请重新注册\n");
						}
					}
				}

			}
			else if(pt.flag==0)
			{
				printf("用户名不能为空!\n");
			}
			else 
				printf("用户名之间不能有空格,请重新注册\n");
			break;
		case 3:
			if (pt.flag==0)
			{
				Help_unlogin();
			}
			else if (pt.flag==1)
			{
				for (j=0;j<strlen(para[0]);j++)
				{
					para[0][j]=tolower(para[0][j]);
				}
				HelpA(para[0]);
			}
			else
			{
				printf("参数错误,请重新输入");
			}
			break;
		case 4:
			Quit();
			break;
		}
	}
}

//处理命令和参数
devide basic_cmddev(char * full_cmd)							//分离命令行中的参数并返回
{
	struct devide  devi;
	char temp[100]="0";
	unsigned int i;
	int n=0;
	strcpy(temp,full_cmd);
	for (i=0;i<strlen(temp);i++)
	{
		if(temp[i]==' ')
			n++;
	}

	if(n==0)
		devi.flag=0;
	else if(n==3)
		devi.flag=-1;
	else
	{
		devi.flag=n;
		i=0;
		while(temp[i++]!=' ')
			n=i+1;
		for (i=0;temp[n]!='\0';i++,n++)
		{
			temp[i]=temp[n];
		}
		temp[i]='\0';
		for (i=0;temp[i]!=' '&&temp[i]!='\0';i++)
		{
			devi.re_para[0][i]=temp[i];
		}
		devi.re_para[0][i]='\0';
		if(temp[i]=='\0')	devi.re_para[1][0]='\0';
		else
		{
			i=0;
			while(temp[i++]!=' ')
				n=i+1;
			for (i=0;temp[n]!='\0';i++,n++)
			{
				temp[i]=temp[n];
			}
			temp[i]='\0';
			for (i=0;temp[i]!='\0';i++)
			{
				devi.re_para[1][i]=temp[i];
			}
			devi.re_para[1][i]='\0';
		}
	}
	return	devi;
}

//登录后的命令等待函数
void Cmdwait(char *username)
{
	unsigned int i,flag=1;
	char basic_able_cmd[][20]={"logout","upload","download","delete","list","find",
		       "mkdir","rmdir","cd","help","quit","rm","pwd","type","mv","cp","fupload","attr"};
	char user_cmd[50];
	char pre_cmd[20];
	
	while(flag)
	{
		int choice=0;
		Cmdcursor(username);			                    //用户登录后的命令提示符显示	
		fflush(stdin);
		gets(user_cmd);
		Del_blank(user_cmd);

		for (i=0;i<strlen(user_cmd);i++)					//大写变为小写
		{
			user_cmd[i]=tolower(user_cmd[i]);
		}
		i=0;
		while ((user_cmd[i]!=' ')&&(user_cmd[i]!='\0'))
		{
			pre_cmd[i]=user_cmd[i];
			i++;
		}
		pre_cmd[i]='\0';
		
		
		if (pre_cmd[0]=='\0')	continue;                    //只输入回车
		for(i=0;i<18;i++)
		{
			if (!strcmp(pre_cmd,basic_able_cmd[i]))
			{
				choice=i+1;
			}
		}
		if (choice!=0)
			flag=user_cmdaction(choice,user_cmd,username);   //进入用户界面
		else
		{
			printf("\"%s\"不是内部命令,请重新输入",pre_cmd);
		}
	}
}

//登录后的命令响应函数
int user_cmdaction(int choice,char * full_cmd,char *username)
{
	devide  pt;
	char F_cmd[100];
	char para[2][50];
	char rootdir[255];                                     //根目录在系统中的路径
	int i=0;
	strcpy(F_cmd,full_cmd);
	pt=basic_cmddev(F_cmd);
	while(i++<2)
		strcpy(para[i-1],pt.re_para[i-1]);
	if(pt.flag==-1)
	{
		printf("参数错误,请重新输入\n");
		return 1;
	}
	else
	{
		switch (choice)
		{
		case 1:
			if (pt.flag==0)
			{	
				Severroot(rootdir,username);
				chdir(rootdir);
				chdir("..");
				printf("成功退出登录\n");
				return 0;
			}
			else
			{
				printf("参数个数不正确\n");
				return 1;
			}

		case 2:
			if (pt.flag==2)
			{
				upload(para[0],para[1]);
			}
			else
				printf("参数个数不正确\n");
			return 1;
		case 3:
			if (pt.flag==2)
			{
				download(para[0],para[1]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 4:
			if (pt.flag==1)
			{
				Removefile(para[0]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 5:
			if (pt.flag==0)
			{
				List();
			} 
			else if (pt.flag==1)
			{
				if (strcmp(para[0],"-r")==0)
				{
					List_R();
				}
				else
				{
					printf("参数输入错误\n");
				}
			}
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 6:
			if (pt.flag==2)
			{
				FindfileAB(para[0],para[1]);
			} 
			else if (pt.flag==1)
			{
				FindfileA(para[0]);
			}
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 7:
			if (pt.flag==1)
			{
				Makedir(para[0]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 8:
			if (pt.flag==1)
			{
				Removedir(para[0]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 9:
			if (pt.flag==1)
			{
				Changedir(para[0],username);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 10:
			if (pt.flag==1)
			{
				HelpA(para[0]);
			} 
			else if (pt.flag==0)
			{
				Help_login();
			}
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 11:
			if (pt.flag==0)
			{
				Quit();
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 12:
			if (pt.flag==2)
			{
				Renamedir(para[0],para[1]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 13:
			if (pt.flag==0)
			{
				Pwd(username);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 14:
			if (pt.flag==1)
			{
				Type(para[0]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 15:
			if (pt.flag==2)
			{
				mv_file(para[0],para[1]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 16:
			if (pt.flag==2)
			{
				cpy_file(para[0],para[1]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 17:
			if (pt.flag==2)
			{
				Fupload(para[0],para[1]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		case 18:
			if (pt.flag==1)
			{
				File_Atr(para[0]);
			} 
			else
			{
				printf("参数个数不正确\n");
			}			
			return 1;
		default:
			return 1;
		}

	}
}

//删除输入命令多余的空格
void Del_blank(char * ful_cmd)
{
	int i,j,n=0;
	char temp[100];
	strcpy(temp,ful_cmd);
	while(temp[0]==' ')										//若第一位为空格,删除,并重新判断第一位
	{
		for (i=0;temp[i]!='\0';i++)
			temp[i]=temp[i+1];
		temp[i]='\0';
	}
	for (i=0;temp[i]!='\0';i++)
	{
		if ((n==1)&&(temp[i]==' '))							//若上一位是空格,且本位也是空格,删除空格
		{
			for (j=i;temp[j]!='\0';j++)						//i保留原位置
			{
				temp[j]=temp[j+1];
			}
			temp[j]='\0';	i-=1;							//返回判断前移以后第i位是否为空格
		}
		if(temp[i]!=' ')									//第i位不为空格,则n=0
			n=0;
		else
			n=1;											//第i位为空格,n=1
	}
	for (i=strlen(temp)-1;i>=0;i++)
	{
		if (temp[i]==' ')
		{
			temp[i]=0;
		}
		else
		{
			break;
		}
	}
	strcpy(ful_cmd,temp);
}

⌨️ 快捷键说明

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