ftp客户端封装
2020-05-10 16:00:25来源:博客园 阅读 ()
ftp客户端封装
/**************************************************************************************/ /* 程序名:_ftp.h,此程序是freecplus框架的ftp客户端工具的类的声明文件。 */ /* 作者:C语言技术网(www.freecplus.net) 日期:20190525。 */ /* */ /* freecplus开源许可协议正文如下: */ /* 版权所有 (c) 2008-2020, 码农有道,C语言技术网(www.freecplus.net)。 */ /* 特此向任何得到本软件副本或相关文档的人授权:被授权人有权使用、复制、修改、 */ /* 合并、出版、发布、散布、再授权和/或贩售软件及软件的副本,及授予被供应人同 */ /* 等权利,只需服从以下义务: */ /* 在软件和软件的所有副本中都必须包含以上版权声明和本许可声明。 */ /* 如果违返,无论在本软件的使用上或其他买卖交易中是否涉及合同,都属于侵权行为, */ /* 我们保留追究的权利。 */ /* freecplus开源许可协议正文结束。 */ /**************************************************************************************/
// // 本程序演示Cftp客户端类,采用ftp协议从服务器上获取文件 // #include "_ftp.h" int main(int argc,char *argv[]) { Cftp ftp; // 登录远程FTP服务器 if (ftp.login("45.189.123.78","ssc","123",FTPLIB_PASSIVE) == false) { printf("ftp.login() failed.\n"); return -1; } ftp.chdir("/home/ssc_zcys/ssc/profession/qxidc/data/ftp/surfdata"); ftp.nlist("/home/ssc_zcys/ssc/profession/qxidc/data/ftp/surfdata","/tmp/tmp.list"); ftp.nlist("","/tmp/tmp.list1"); ftp.nlist(".","/tmp/tmp.list2"); ftp.nlist("*","/tmp/tmp.list3"); ftp.put("/home/ssc/Desktop/qxidc/data/ftp/surfdata/SURF_ZH_20200509160907_5553.txt","/tmp/SURF_ZH_20200509160907_5553.txt",true); // 改变本地目录 chdir("/tmp"); //根目录下的tmp文件夹 // 进入ftp服务器上文件存放的目录 if (ftp.chdir("/home/ssc_zcys/ssc/profession/qxidc/data/ftp/surfdata") == false) { printf("ftp.chdir() failed.\n"); return -1; } // 获取对方目录文件的列表,存放在"/tmp/ftp.list"文件中 if (ftp.nlist("*.txt","/tmp/ftp.list")== false) { printf("ftp.nlist() failed.\n"); return -1; } CFile File; File.Open("/tmp/ftp.list","rt"); char strFileName[101]; // 逐行读取文件的内容,并把文件get到本地 while (true) { // 从文件中读取一行 memset(strFileName,0,sizeof(strFileName)); if (File.Fgets(strFileName,100) == false) break; strFileName[strlen(strFileName)-1] = 0; printf("get %s ...",strFileName); // 从远程取文件 if (ftp.get(strFileName,strFileName)==false) { printf("ftp.get(%s) failed.\n",strFileName); break; } printf("ok.\n"); } File.Close(); ftp.logout(); return 0; }
这是客户端程序,在本地。连接服务器,获取服务器上的文件,上传本地文件。
/**************************************************************************************/ /* 程序名:_ftp.h,此程序是freecplus框架的ftp客户端工具的类的声明文件。 */ /* 作者:C语言技术网(www.freecplus.net) 日期:20190525。 */ /* */ /* freecplus开源许可协议正文如下: */ /* 版权所有 (c) 2008-2020, 码农有道,C语言技术网(www.freecplus.net)。 */ /* 特此向任何得到本软件副本或相关文档的人授权:被授权人有权使用、复制、修改、 */ /* 合并、出版、发布、散布、再授权和/或贩售软件及软件的副本,及授予被供应人同 */ /* 等权利,只需服从以下义务: */ /* 在软件和软件的所有副本中都必须包含以上版权声明和本许可声明。 */ /* 如果违返,无论在本软件的使用上或其他买卖交易中是否涉及合同,都属于侵权行为, */ /* 我们保留追究的权利。 */ /* freecplus开源许可协议正文结束。 */ /**************************************************************************************/ #ifndef __FTP_H #define __FTP_H #include "_public.h" #include "ftplib.h" class Cftp { public: // ftp连接句柄 netbuf *m_ftpconn; // 文件的大小 unsigned int m_size; // 文件的时间modifytime char m_mtime[21]; Cftp(); ~Cftp(); // 存放login()方法登录失败的原因 bool m_connectfailed; bool m_loginfailed; bool m_optionfailed; void initdata(); // 登录ftp服务器 // in_host 服务器地址和端口,中间用":"分隔,如"192.168.1.1:21" // in_username ftp用户名 // in_password ftp的密码 // in_mode 传输模式,FTPLIB_PASSIVE是被动模式,FTPLIB_PORT是主动模式 bool login(const char *in_host,const char *in_username,const char *in_password,const int in_mode=FTPLIB_PASSIVE); // 注销 bool logout(); // 获取ftp服务器上文件的时间 bool mtime(const char *in_remotefilename); // 获取ftp服务器上文件的大小 bool size(const char *in_remotefilename); // 向服务端发送site命令 bool site(const char *in_command); // 改变ftp远程目录 bool chdir(const char *in_remotedir); // 在ftp服务器上创建目录 bool mkdir(const char *in_remotedir); // 删除ftp服务器上的目录 bool rmdir(const char *in_remotedir); // 发送list命令列出ftp服务器目录中的文件,结果保存到本地文件中 // 如果是列出当前目录,in_remotedir用"" , "*" , "."都行。 bool nlist(const char *in_remotedir,const char *out_listfilename); // 发送dir命令列出ftp服务器目录中的文件,结果保存到本地文件中 bool dir(const char *in_remotedir,const char *out_listfilename); // 从ftp服务器上获取文件 // in_remotefilename 待获取的远程文件名 // in_localfilename 本地文件名,可以与in_remotefilename不同 // bCheckMTime 文件传输完成后,是否核对文件传输前后的时间,保证文件的完整性 // 注意,文件在传输的过程中,采用临时文件命名的方法,即在in_localfilename后加".tmp",在传输 // 完成后才正式改为in_localfilename bool get(const char *in_remotefilename,const char *in_localfilename,const bool bCheckMTime=true); // 向ftp服务器发送文件 // in_localfilename 本地待发送的文件名 // in_remotefilename 远程文件名 // bCheckSize 文件传输完成后,是否核对本地和远程文件的大小,保证文件的完整性 // 注意,文件在传输的过程中,采用临时文件命名的方法,即在in_remotefilename后加".tmp",在传输 // 完成后才正式改为in_remotefilename bool put(const char *in_localfilename,const char *in_remotefilename,const bool bCheckSize=true); // 删除ftp服务器上的文件 bool ftpdelete(const char *in_remotefilename); // 把ftp服务器上的文件改名 bool ftprename(const char *in_srcremotefilename,const char *in_dstremotefilename); // 获取服务器返回信息的最后一条 return a pointer to the last response received char *response(); }; #endif
/**************************************************************************************/ /* 程序名:_ftp.cpp,此程序是freecplus框架的ftp客户端工具的类的定义文件。 */ /* 作者:C语言技术网(www.freecplus.net) 日期:20190525。 */ /* */ /* freecplus开源许可协议正文如下: */ /* 版权所有 (c) 2008-2020, 码农有道,C语言技术网(www.freecplus.net)。 */ /* 特此向任何得到本软件副本或相关文档的人授权:被授权人有权使用、复制、修改、 */ /* 合并、出版、发布、散布、再授权和/或贩售软件及软件的副本,及授予被供应人同 */ /* 等权利,只需服从以下义务: */ /* 在软件和软件的所有副本中都必须包含以上版权声明和本许可声明。 */ /* 如果违返,无论在本软件的使用上或其他买卖交易中是否涉及合同,都属于侵权行为, */ /* 我们保留追究的权利。 */ /* freecplus开源许可协议正文结束。 */ /**************************************************************************************/ #include "_ftp.h" Cftp::Cftp() { m_ftpconn=0; initdata(); FtpInit(); m_connectfailed=false; m_loginfailed=false; m_optionfailed=false; } Cftp::~Cftp() { logout(); } void Cftp::initdata() { m_size=0; memset(m_mtime,0,sizeof(m_mtime)); } bool Cftp::login(const char *in_host,const char *in_username,const char *in_password,const int in_mode) { if (m_ftpconn != 0) { FtpQuit(m_ftpconn); m_ftpconn=0; } m_connectfailed=m_loginfailed=m_optionfailed=false; if (FtpConnect(in_host,&m_ftpconn) == false) { m_connectfailed=true; return false; } if (FtpLogin(in_username,in_password,m_ftpconn) == false) { m_loginfailed=true; return false; } if (FtpOptions(FTPLIB_CONNMODE,(long)in_mode,m_ftpconn) == false) { m_optionfailed=true; return false; } return true; } bool Cftp::logout() { if (m_ftpconn == 0) return false; FtpQuit(m_ftpconn); m_ftpconn=0; return true; } bool Cftp::get(const char *in_remotefilename,const char *in_localfilename,const bool bCheckMTime) { if (m_ftpconn == 0) return false; // 创建本地文件目录 MKDIR(in_localfilename); char strlocalfilenametmp[301]; memset(strlocalfilenametmp,0,sizeof(strlocalfilenametmp)); snprintf(strlocalfilenametmp,300,"%s.tmp",in_localfilename); // 获取远程服务器的文件的时间 if (mtime(in_remotefilename) == false) return false; // 取文件 if (FtpGet(strlocalfilenametmp,in_remotefilename,FTPLIB_IMAGE,m_ftpconn) == false) return false; // 判断文件获取前和获取后的时间,如果时间不同,表示文件已改变,返回失败 if (bCheckMTime==false) { char strmtime[21]; strcpy(strmtime,m_mtime); if (mtime(in_remotefilename) == false) return false; if (strcmp(m_mtime,strmtime) != 0) return false; } // 重置文件时间 UTime(strlocalfilenametmp,m_mtime); // 改为正式的文件 if (rename(strlocalfilenametmp,in_localfilename) != 0) return false; // 获取文件的大小 m_size=FileSize(in_localfilename); return true; } bool Cftp::mtime(const char *in_remotefilename) { if (m_ftpconn == 0) return false; memset(m_mtime,0,sizeof(m_mtime)); char strmtime[21]; memset(strmtime,0,sizeof(strmtime)); if (FtpModDate(in_remotefilename,strmtime,14,m_ftpconn) == false) return false; AddTime(strmtime,m_mtime,0+8*60*60,"yyyymmddhh24miss"); return true; } bool Cftp::size(const char *in_remotefilename) { if (m_ftpconn == 0) return false; m_size=0; if (FtpSize(in_remotefilename,&m_size,FTPLIB_IMAGE,m_ftpconn) == false) return false; return true; } bool Cftp::site(const char *in_command) { if (m_ftpconn == 0) return false; if (FtpSite(in_command,m_ftpconn) == false) return false; return true; } bool Cftp::chdir(const char *in_remotedir) { if (m_ftpconn == 0) return false; if (FtpChdir(in_remotedir,m_ftpconn) == false) return false; return true; } bool Cftp::mkdir(const char *in_remotedir) { if (m_ftpconn == 0) return false; if (FtpMkdir(in_remotedir,m_ftpconn) == false) return false; return true; } bool Cftp::rmdir(const char *in_remotedir) { if (m_ftpconn == 0) return false; if (FtpRmdir(in_remotedir,m_ftpconn) == false) return false; return true; } bool Cftp::dir(const char *in_remotedir,const char *out_listfilename) { if (m_ftpconn == 0) return false; if (FtpDir(out_listfilename,in_remotedir,m_ftpconn) == false) return false; return true; } bool Cftp::nlist(const char *in_remotedir,const char *out_listfilename) { if (m_ftpconn == 0) return false; // 创建本地文件目录 MKDIR(out_listfilename); if (FtpNlst(out_listfilename,in_remotedir,m_ftpconn) == false) return false; return true; } bool Cftp::put(const char *in_localfilename,const char *in_remotefilename,const bool bCheckSize) { if (m_ftpconn == 0) return false; char strremotefilenametmp[301]; memset(strremotefilenametmp,0,sizeof(strremotefilenametmp)); snprintf(strremotefilenametmp,300,"%s.tmp",in_remotefilename); if (FtpPut(in_localfilename,strremotefilenametmp,FTPLIB_IMAGE,m_ftpconn) == false) return false; if (FtpRename(strremotefilenametmp,in_remotefilename,m_ftpconn) == false) return false; // 判断已上传的文件的大小与本地文件是否相同,确保上传成功。 if (bCheckSize==true) { if (size(in_remotefilename) == false) return false; if (m_size != FileSize(in_localfilename)) return false; } return true; } bool Cftp::ftpdelete(const char *in_remotefilename) { if (m_ftpconn == 0) return false; if (FtpDelete(in_remotefilename,m_ftpconn) == false) return false; return true; } bool Cftp::ftprename(const char *in_srcremotefilename,const char *in_dstremotefilename) { if (m_ftpconn == 0) return false; if (FtpRename(in_srcremotefilename,in_dstremotefilename,m_ftpconn) == false) return false; return true; } char *Cftp::response() { if (m_ftpconn == 0) return 0; return FtpLastResponse(m_ftpconn); }
原文链接:https://www.cnblogs.com/zcys/p/12861844.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:聚合类型与POD类型
下一篇:C++ 存储持续性
- QT程序自启动 2019-12-03
- 个人项目开源之c++基于epoll实现高并发游戏盒子(服务端+客 2019-11-28
- Unary模式下客户端创建 default-executor 和 resolver-execu 2019-10-29
- QJsonObject与QString转化封装 2019-10-12
- C/C++、Qt4实现FTP客户端(有无界面版) 2019-09-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash