ftp客户端封装

0
13

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

<

发布回复

请输入评论!
请输入你的名字