当前位置: 移动技术网 > IT编程>开发语言>C/C++ > ftp客户端封装

ftp客户端封装

2020年05月11日  | 移动技术网IT编程  | 我要评论

baby phat,上传flash,十二生肖爆裂战士


/**************************************************************************************/
/*   程序名:_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);
}

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网