zoukankan      html  css  js  c++  java
  • 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. "); 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. "); return -1; } // 获取对方目录文件的列表,存放在"/tmp/ftp.list"文件中 if (ftp.nlist("*.txt","/tmp/ftp.list")== false) { printf("ftp.nlist() failed. "); 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. ",strFileName); break; } printf("ok. "); } 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);
    }
  • 相关阅读:
    升级python2.7, 实现python2.7与python3并存

    JDK一键部署, 新添加进度条
    银行分类概述
    个人银行结算账户类别
    银联刷卡POS机冲正
    银行怎样处理坏账和贷款展期
    数据加解密和数据签名验签
    一行三会/首批试点民营银行
    前端base64加密
  • 原文地址:https://www.cnblogs.com/zcys/p/12861844.html
Copyright © 2011-2022 走看看