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

📄 filecmd.cpp

📁 用C实现的本地服务器
💻 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 + -