ftp协议采集对方服务器的文件(C语言实现)

本程序照搬的话肯定运行不起来的,因为程序中需要一些库文件本文章没有提供
1.使用封装过后的libftp库来采集服务器的文件

#include "_freecplus.h"
#include "_ftp.h"

struct st_arg
{
     char ip[31];            // IP地址和端口
     int mode;               // ftp模式
     char username[101];     // ftp用户名
     char password[101];     // ftp密码
     char localpath[301];    // 采集过来的文件存放路径
     char remotepath[301];   // 服务器存放文件的路径
     char remotepathbak[301]; // 服务器存放备份文件的路径
     int timeval;              // 运行时间间隔
     int ptype;                // 采集模式 1-增量采集 2-删除  3-备份
     char matchname[301];      // 匹配的文件名
     char listfilename[301];       // 使用nlist命令后存储文件清单的文件
     char okfilename[301];       //  存储采集成功的文件,使用xml格式存储
}starg;

struct file_info
{ 
     char filename[301]; 
     char mtime[301]; 	
};

void EXIT(int sig); 
void _help(char *argv[]);
bool _xmltobuffer(char *xmlbuffer); 
bool LoadList();     // 将文件清单的内容加到容器
bool _ftpgetwpfiles();   // 业务处理主函数
bool AppendToOKFileName(struct file_info *stfileinfo);  // 如果ptype==1,把采集成功的文件记录追加到okfilename文件中
bool LoadOKFileName();// 把okfilename文件内容加载到vokfilename容器中
bool CompVector();        // 容器之间进行对比
bool WriteToOKFileName();    // 采集成功的文件写入vokfilename容器,覆盖旧的vokfilename

Cftp ftp;
CLogFile logfile; 
vector<struct file_info> vlistfile,vlistfile1; 
vector<struct file_info> vokfilename,vokfilename1; 


int main(int argc,char *argv[])
{ 
    if(argc != 3)
    {
        _help(argv);  return -1;
    } 
    CloseIOAndSignal();  signal(SIGINT,EXIT);  signal(SIGTERM,EXIT); 
    if(logfile.Open(argv[1],"a+") == false)
    { 
       printf("logfile.Open(%s) is failed\n");
       return -1; 	
    }
    logfile.Write("open logfile (%s) is ok\n",argv[1]);  
    if(_xmltobuffer(argv[2]) == false)
    {
    		logfile.Write("_xmltobuffer is failed\n"); 
    		return -1;
    }
    logfile.Write("_xmltobuffer() is ok\n"); 
    while(true)
    {
    	  if(ftp.login(starg.ip,starg.username,starg.password,starg.mode) == false)
    	  	{
    	  		  logfile.Write("ftp.login(%s,%s,%s,%d) is failed\n",starg.ip,starg.username,starg.password,starg.mode); 
    	  		  return -1; 
    	  	}  
    	  	logfile.Write("ftp.login() is ok\n"); 
    	  if(_ftpgetwpfiles() == false)
    	  	{
    	  		 logfile.Write("_ftpgetwpfiles() is fialed\n"); 
    	  		 return -1;
    	  	} 
    	  ftp.logout(); 
    	  sleep(starg.timeval);   
    }	
    return 0; 
}

void EXIT(int sig)
{
    logfile.Write("程序退出,sig=%d\n",sig); 
    exit(0);
}

void _help(char *argv[])
{ 
     printf("\n"); 
     printf("Using:/home/cerzong/htidc/c/ftpgetwpfiles logfilename xmlbuffer\n"); 
     printf("\n"); 
     printf("Example: /home/cerzong/htidc/c/ftpgetwpfiles  /home/cerzong/htidc/log/ftpgetwpfiles.log \"<ip>127.0.0.1:21</ip><mode>1</mode><username>xxxxxx</username><password>xxxxx</password><localpath>/home/cerzong/htidc/data/wpfiles</localpath><remotepath>/home/cerzong/wpfile</remotepath><remotepathbak>/home/cerzong/wpfilebak</remotepathbak><timeval>60</timeval><ptype>1</ptype><matchname>*.DTB</matchname><listfilename>/home/cerzong/htidc/list/listfile.list</listfilename><okfilename>/home/cerzong/htidc/list/okfilename.xml</okfilename>\"\n");
     printf("\n"); 
     printf("本程序采集分区预警信号文件\n"); 
     printf("<ip> ftp服务器的IP地址和端口\n"); 
     printf("<mode> ftp模式\n"); 
     printf("<username> ftp用户名\n"); 
     printf("<password> ftp密码\n"); 
     printf("<remotepath>  服务器文件存放的目录\n"); 
     printf("<remotepathbak> 服务器文件备份的目录,当ptype==3时有效\n"); 
     printf("<timeval> 程序运行时间间隔\n"); 
     printf("<ptype> 当ptype==1时,增量采集 ptype==2 删除服务器的文件 ptype==3 备份服务器文件\n"); 
     printf("<matchname> 需采集文件的匹配名\n"); 
     printf("<lsitfilename> 文件清单 路径全称\n"); 
     printf("<okfilename> 采集成功的文件清单 路径全称\n"); 
     printf("\n");   
}

bool _xmltobuffer(char *xmlbuffer)
{
	   memset(&starg,0,sizeof(struct st_arg)); 
	   GetXMLBuffer(xmlbuffer,"ip",starg.ip); 
	   if(strlen(starg.ip) == 0)  
	   {  logfile.Write("ip is null\n");   return false; } 
	   
	   GetXMLBuffer(xmlbuffer,"mode",&starg.mode); 
	   if(starg.mode != 1)
	   	{  logfile.Write("mode is error,starg.mode=%d\n",starg.mode);  return false; } 
	   	
	   GetXMLBuffer(xmlbuffer,"username",starg.username); 
	   if(strlen(starg.username)==0)
	   	{   logfile.Write("username is null\n");  return false;  } 
	   	
	   GetXMLBuffer(xmlbuffer,"password",starg.password); 
	   if(strlen(starg.password)==0)
	   	{   logfile.Write("password is null\n");  return false;  } 
	   	
	   GetXMLBuffer(xmlbuffer,"remotepath",starg.remotepath); 
	   if(strlen(starg.remotepath)==0)
	   	{   logfile.Write("remotepath is null\n");  return false;  } 
	   
	   GetXMLBuffer(xmlbuffer,"remotepathbak",starg.remotepathbak); 
	   if(strlen(starg.remotepathbak)==0)
	   	{   logfile.Write("remotepathbak is null\n");  return false;  } 
	   	
	   GetXMLBuffer(xmlbuffer,"timeval",&starg.timeval); 
	   if(starg.timeval==0)
	   	{   logfile.Write("timeval is 0\n");  return false;  } 
	   	
	   GetXMLBuffer(xmlbuffer,"ptype",&starg.ptype); 
	   if(starg.ptype==0)
	   	{   logfile.Write("ptype is 0\n");  return false;  } 
	   	
	   	GetXMLBuffer(xmlbuffer,"matchname",starg.matchname); 
	   if(strlen(starg.matchname)==0)
	   	{   logfile.Write("matchname is null\n");  return false;  } 
	   	
	   		GetXMLBuffer(xmlbuffer,"listfilename",starg.listfilename); 
	   if(strlen(starg.listfilename)==0)
	   	{   logfile.Write("listfilename is null\n");  return false;  } 
	   	
	   	GetXMLBuffer(xmlbuffer,"okfilename",starg.okfilename); 
	   if(strlen(starg.okfilename)==0)
	   	{   logfile.Write("okfilename is null\n");  return false;  } 
	   	
	   	GetXMLBuffer(xmlbuffer,"localpath",starg.localpath); 
	   	if(strlen(starg.localpath)==0)
	   		{
	   			 logfile.Write("localpath is null\n");   return false; 
	   		}
	   	
	   	return true;
}

bool LoadList()
{ 
     	vlistfile.clear(); 
     	CFile File; 
      if(File.Open(starg.listfilename,"r") == false) 
      	{
      		logfile.Write("File.Open(%s) is failed\n");  return false; 
      	}
      struct file_info stfileinfo; 
      while(true)
      {
      	 memset(&stfileinfo,0,sizeof(struct file_info));
      	 	if(File.Fgets(stfileinfo.filename,300,true) == false)  break; 
      	 	if(starg.ptype==1)
      	 		{
      	 			   if(ftp.mtime(stfileinfo.filename) == false)  
      	 			   	{
      	 			   		  logfile.Write("ftp.mtime() is fialed\n");  
      	 			   	}  
      	 			   strcpy(stfileinfo.mtime,ftp.m_mtime); 
      	 		}
      	 	vlistfile.push_back(stfileinfo); 
      }
     
      return true; 
}

bool _ftpgetwpfiles()
{
	   if(ftp.chdir(starg.remotepath) == false) 
	   	{
	   		 logfile.Write("ftp.chdir(%s) is fialed\n",starg.remotepath); 
	   		 return false; 
	   	} 
	   	
	   if(ftp.nlist(".",starg.listfilename) == false)
	   	{
	   		 logfile.Write("ftp.nlist() is failed, starg.remotepath=%s,starg.listfilename=%s\n",starg.remotepath,starg.listfilename); 
	   		 return false; 
	   	} 
	   	
	   if(LoadList() == false)
	   	{
	   		 logfile.Write("LoadList() is fialed\n");  return false; 
	   	}
	   	if(starg.ptype ==1)
	   	{
	   	   	
	   	   		LoadOKFileName();
               CompVector();
               WriteToOKFileName();
            // 把vlistfile1容器中的内容复制到vlistfile容器中
               vlistfile.clear(); vlistfile.swap(vlistfile1);
	   	}
	    for(int ii=0;ii<vlistfile.size();ii++)
	    {
	    	   char strlocalpath[301]; 
	    	   char strremotepath[301];
	    	  
	    	   sprintf(strlocalpath,"%s/%s",starg.localpath,vlistfile[ii].filename); 
	    	   sprintf(strremotepath,"%s/%s",starg.remotepath,vlistfile[ii].filename);
	    	   
	    	   logfile.WriteEx("get %s...",strremotepath);
	    	    
	    	   if (ftp.get(strremotepath,strlocalpath,true)==false) 
	    	   	{
	    	   		  logfile.WriteEx("failed\n");
	    	   		  break;
	    	   	} 
	    	   	logfile.WriteEx("ok\n");
	    	    // 删除
	    	   if(starg.ptype==2)
	    	   	{
	    	   		  ftp.ftpdelete(strremotepath); 
	    	   	}
	    	   	// 备份 
	    	   if(starg.ptype==3)
	    	    {
	    	   	    char strremotepathbak[301]; 
	    	   	    sprintf(strremotepathbak,"%s/%s",starg.remotepathbak,vlistfile[ii].filename); 
	    	   	    ftp.ftprename(strremotepath,strremotepathbak);
	    	    }
	    	   if(starg.ptype==1)   
	    	   // 将采集成功的文件名字和时间添加okfilename文件里 <filename>ssss.DTB</filename><mtime>22</mtime> 	
	    	   AppendToOKFileName(&vlistfile[ii]);
	    	   
	    }
	   	
	   	return true;
}

bool AppendToOKFileName(struct file_info *stfileinfo)
{
	   CFile File; 
	   if(File.Open(starg.okfilename,"a",false) == false)  
	   	{
	   		   logfile.Write("File.Open(%s) failed\n",starg.okfilename); 
	   		   return false; 
	   	}  
	   	File.Fprintf("<filename>%s</filename><mtime>%s</mtime>\n",stfileinfo->filename,stfileinfo->mtime); 
	   	return true; 
}

// 把okfilename中的内容加载到容器中
bool LoadOKFileName()
{ 
	    vokfilename.clear(); 
	    CFile File; 
	    // 第一次打开的时候没有文件内容
	    if(File.Open(starg.okfilename,"r",false) == false)
	    {
	    		  logfile.Write("File.Open(%s) is failed\n",starg.okfilename); 
	    		  return true; 
	    } 
	    char strbuffer[301]; 
	    struct file_info stfileinfo; 
	    while(true)
	    {
	    	   memset(strbuffer,0,sizeof(strbuffer));
	    	   memset(&stfileinfo,0,sizeof(struct file_info));  
	    	   if(File.Fgets(strbuffer,300,true) == false)  break; 
	    	   GetXMLBuffer(strbuffer,"filename",stfileinfo.filename);
	    	   GetXMLBuffer(strbuffer,"mtime",stfileinfo.mtime); 
	    	   
	    	   vokfilename.push_back(stfileinfo); 
	    }	 
	    return true;
}

// 把vlistfile容器中的文件与vokfilename容器中文件对比,得到两个容器
// 一、在vlistfile中存在,并已经采集成功的文件vokfilename1
// 二、在vlistfile中存在,新文件或需要重新采集的文件vlistfile1
bool CompVector()
{    
	    vokfilename1.clear();  vlistfile1.clear();

      for (int ii=0;ii<vlistfile.size();ii++)
      {
         int jj=0;
         for (jj=0;jj<vokfilename.size();jj++)
      {
         if ( (strcmp(vlistfile[ii].filename,vokfilename[jj].filename)==0) &&
           (strcmp(vlistfile[ii].mtime,vokfilename[jj].mtime)==0) )
        {
           vokfilename1.push_back(vlistfile[ii]); break;
        }
    }

      if (jj==vokfilename.size())
      {
           vlistfile1.push_back(vlistfile[ii]);
      }
}
	   return true;
}

//把vokfilename1容器中的内容先写入okfilename文件中,覆盖之前的旧okfilename文件
bool WriteToOKFileName()
{
	   CFile File; 
	   if(File.Open(starg.okfilename,"w",false) == false)
	   	{
	   		  logfile.Write("File.Open(%s) is failed\n",starg.okfilename);  return false; 
	   	} 
	   for(int ii=0;ii<vokfilename1.size();ii++)
	    {
	   	    File.Fprintf("<filename>%s</filename><mtime>%s</mtime>\n",vokfilename1[ii].filename,vokfilename1[ii].mtime); 
	    } 
	   return true;
}

2.编写Makefile

CC=g++
FLAG=-g
all:libftp.a ftpgetfiles
libftp.a: ftplib.c
                gcc -c -o libftp.a ftplib.c
ftpgetfiles:ftpgetfiles.cpp _ftp.h _ftp.cpp libftp.a
                $(CC) $(FLAG) -o ftpgetfiles ftpgetfiles.cpp _freecplus.cpp _ftp.cpp libftp.a -lm -lc
                cp ftpgetfiles /oracle/htidc/bin/
clean:
                rm -rf libftp.a ftpgetfiles             

3,编写完Makefile后执行make命令编译Makefile文件,之后执行ftpgetfiles程序来采集文件
在这里插入图片描述

程序执行后可以通过日志看到文件采集成功
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值