📄 filesever.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 + -