📄 filecmd.cpp
字号:
/***
*filecmd.cpp - 文件管理命令各函数及其所调用的函数
*
* 编写者:杨金锋、王慧松、李拓
*
* 完成时间:2008年11月14日
*
* 修改时间:
*
* 包含函数:
* Renamedir()
* List() 调用Ifdir()
* FindfileA()及FindfileAB() 调用Ifdir(),IfmatchA(),Severroot(),Get_nextval()
* Cmdcursor() 调用 Severroot()
****/
#include "StdAfx.h"
//处理地址
char * chuli(char * p1,char *p2)
{
char temp[200];
char wanzheng[100];
char wjm[200];
int n,i;
n=strlen(p1);
strcpy(wanzheng,p2);
strcpy(temp,p1);
while (temp[n]!='\\')
{
n--;
}
if(n<0) //直接是文件名,则整个赋给wjm
{
strcpy(wjm,p1);
}
else //否则取其中的文件名
{
for (i=0,n+=1;temp[n]!='\0';i++,n++)
{
wjm[i]=temp[n];
}
wjm[i]='\0';
}
// puts(wjm);
n=strlen(p2);
if(wanzheng[n-1]!='\\')
{
wanzheng[n]='\\';
wanzheng[n+1]='\0';
}
else
wanzheng[n]='\0';
strcat(wanzheng,wjm);
strcpy(p2,wanzheng);
return p2;
}
//从*p1处上传到*p2处
void upload(char * p1,char * p2)
{
char ch;
FILE * FromF,* ToF;
char buf[255]; //保存当前路径
chuli(p1,p2);
if (p2[0]=='\\')
{
getcwd(buf,255);
strcat(buf,p2);
}
else
{
strcpy(buf,p2);
}
// puts(p2);
if ((FromF=fopen(p1,"rb+"))==NULL) //判断文件和路径是否正确
{
printf("文件不存在\n");
return;
}
if ((ToF=fopen(buf,"wb+"))==NULL)
{
printf("目标路径不存在\n");
return;
}
while ((ch=fgetc(FromF))!=EOF) //上传
{
fputc(ch,ToF);
}
fclose(FromF);
fclose(ToF);
}
//将*p1文件下载到*p2
void download(char * p1,char *p2)
{
int n;
char ch;
FILE * FromF,* ToF;
char buf[80];
getcwd(buf,sizeof(buf));
n=strlen(buf);
buf[n]='\\'; buf[n+1]='\0';
strcat(buf,p1);
p2=chuli(p1,p2);
if ((FromF=fopen(p1,"rb+"))==NULL) //判断文件和路径是否正确
{
printf("文件不存在\n");
return;
}
if ((ToF=fopen(p2,"wb+"))==NULL)
{
printf("给定路径不存在\n");
return;
}
while ((ch=fgetc(FromF))!=EOF) //下载
{
fputc(ch,ToF);
}
fclose(FromF);
fclose(ToF);
}
//删除文件
void Removefile(char *filename)
{
if (filename[0]=='\\')
{
strcpy(filename,filename+1);
}
if (access(filename,0)==-1) //检验目录是否存在
{
printf("找不到指定的文件,未成功删除\n");
return;
}
if (remove(filename)!=0)
{
printf("未能成功删除文件%s",filename);
}
}
//判断是否文件夹
int Ifdir(char* filename)
{
struct _stat buf;
_stat( filename, &buf );
if (buf.st_mode==16895)
{
return 0; //是文件夹
}
if (buf.st_mode==33206||buf.st_mode==33279||buf.st_mode==52428||buf.st_mode==16749||buf.st_mode==33060)
{
return 1; //是文件
}
printf("系统出现错误\n");
return -1;
}
//罗列当前目录中的文件和目录,调用Ifdir函数
void List()
{
struct _finddata_t c_file; //定义结构体保存属性信息
long hFile;
int fnumber=0; //记录所给目录中全部的文件和文件夹数
char buffer[30];
//查找指定路径中的第一个文件
if( (hFile = _findfirst( "*", &c_file )) == -1L )
printf( "系统出现错误!\n" );
else
{
do
{
//文件名为“.”或“..”,则执行continue
if (strcmp(c_file.name,".")==0||strcmp(c_file.name,"..")==0)
{
continue;
}
fnumber++;
strcpy(buffer,ctime( &c_file.time_create ));
printf( "%.24s ",buffer);
if (Ifdir(c_file.name)==0) //是文件夹
{
printf(" dir ");
}
else if (Ifdir(c_file.name)==1) //是文件
{
printf("%9ldB ",c_file.size);
}
else //出现异常
{
return;
}
printf("%-20s ",c_file.name);
printf( ( c_file.attrib & _A_RDONLY ) ? " 只读 " : " 读写 " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " 隐藏 " : " 非隐藏 " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " 系统 " : " " );
printf("\n");
} while( _findnext( hFile, &c_file ) == 0 );
if (fnumber==0)
{
printf("所给目录为空\n");
}
_findclose( hFile );
}
}
void Get_nextval(char * mystring,int *nextval)
{
int i=1,j=0;
nextval[0]=-1;
while (mystring[i-1]!=0)
{
if (j==0||mystring[i-1]==mystring[j-1])
{
i++;
j++;
if (mystring[i-1]!=mystring[j-1])
{
nextval[i-1]=j-1;
}
else
{
nextval[i-1]=nextval[j-1];
}
}
else j=nextval[j-1]+1;
}
}
//判断文件名是否包含关键词(一个关键词)
//即两个字符串的匹配,用KMP算法,调用Get_nextval函数
int IfmatchA(char *filename,char *keyword)
{
int next[50];
int i=1,j=1;
Get_nextval(keyword,next);
while (filename[i-1]!=0&&keyword[j-1]!=0)
{
if (j==0||keyword[j-1]==filename[i-1])
{
i++;
j++;
}
else
j=next[j-1]+1;
}
if (keyword[j-1]==0)
{
return i-j+1;
}
else
return 0;
}
//获取文件服务器的根目录所在操作系统路径,调用IfmatchA函数
void Severroot(char *rootdir,char *username)
{
char sysdirnow[255]; //在操作系统中的当前路径
int namelen; //用户名的长度
int pos;
int i;
getcwd(sysdirnow,255);
pos=IfmatchA(sysdirnow,username);
namelen=strlen(username);
for (i=0;i<pos+namelen-1;i++)
{
rootdir[i]=sysdirnow[i];
}
rootdir[i]=0;
}
//查找当前目录中的文件(一个关键词),调用Ifdir,IfmatchA,Severroot函数
void FindfileA(char *keyword)
{
struct _finddata_t c_file; //定义结构体保存属性信息
long hFile;
int fnumber=0; //记录所给目录中全部的文件和文件夹数
char filename[50]; //文件名临时存储字符串
// char serverdirnow[100]; //文件服务器当前路径
char dirnow[255];
getcwd(dirnow,255);
chdir(dirnow);
//查找指定路径中的第一个文件
if( (hFile = _findfirst( "*", &c_file )) == -1L )
printf( "系统出现错误!\n" );
else
{
do
{
// printf("%s\n",c_file.name);
//是文件夹
if (Ifdir(c_file.name)==0&&(strcmp(c_file.name,".")!=0&&strcmp(c_file.name,"..")!=0))
{
chdir(c_file.name);
FindfileA(keyword); //运用递归
chdir(dirnow);
}
else if (Ifdir(c_file.name)==1) //是文件
{
strcpy(filename,c_file.name);
// int a;
// a=IfmatchA(filename,keyword);
// printf("%d\n",a);
if (IfmatchA(filename,keyword)!=0) //判断文件名是否包含关键词
{
fnumber++;
printf("%s\n",filename);
}
// else printf("not match\n");
}
else if ((strcmp(c_file.name,".")!=0&&strcmp(c_file.name,"..")!=0))
{
return;
}
} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
}
//查找当前目录中的文件(两个关键词),调用Ifdir,IfmatchA,Severroot函数
void FindfileAB(char *keyword1,char *keyword2)
{
struct _finddata_t c_file; //定义结构体保存属性信息
long hFile;
int fnumber=0; //记录所给目录中全部的文件和文件夹数
char filename[50]; //文件名临时存储字符串
char dirnow[255]; //当前系统路径
int ifdir; //记录Ifdir函数的返回值
getcwd(dirnow,255);
chdir(dirnow);
//查找指定路径中的第一个文件
if( (hFile = _findfirst( "*", &c_file )) == -1L )
printf( "系统出现错误!\n" );
else
{
do
{
//是文件夹
ifdir=Ifdir(c_file.name);
if (ifdir==0&&(strcmp(c_file.name,".")!=0&&strcmp(c_file.name,"..")!=0))
{
chdir(c_file.name);
FindfileAB(keyword1,keyword2); //运用递归
chdir(dirnow);
}
else if (ifdir==1) //是文件
{
strcpy(filename,c_file.name);
//判断文件名是否包含关键词
if (IfmatchA(filename,keyword1)!=0&&IfmatchA(filename,keyword2)!=0)
{
fnumber++;
printf("%s\n",filename);
}
}
else if ((strcmp(c_file.name,".")!=0&&strcmp(c_file.name,"..")!=0))
{
return;
}
} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -