本程序照搬的话肯定运行不起来的,因为程序中需要一些库文件本文章没有提供
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程序来采集文件
程序执行后可以通过日志看到文件采集成功