| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | #ifndef CURLFTP_H#define CURLFTP_H#include "curl/curl.h"#include <string>#include <vector>#include <mutex>#include "CurlFtpInfo.h"/** * 使用CURL进行FTP操作,这里是单线程的,需要多线程同时操作,就创建多个实例 * *     1.默认超时时间是30s *     2.FTP默认端口是21,SFTP默认端口是22 *     3.设置好IP和端口号后,后续输入的文件路径都是相对路径,无需添加IP和端口号 *     4.使用ftp,用setFtpIPAndPort()设置IP和端口,使用sftp,用setSftpIPAndPort()设置IP和端口 *     5.这里使用了filesystem,需要C++17支持,uos默认的gcc版本是8.3,支持C++17,但是需要手动开启 *       这个库的支持,在项目文件里添加“stdc++fs”这个库,如下: *          target_link_libraries(${this_exe} PRIVATE stdc++fs) *     6. 如果C++版本低于C++17,会改为Qt的QDir */class CurlFtp{public:    CurlFtp();    ~CurlFtp();    /*********************** 成员函数 *********************/    /* 设置用户名和密码 */    bool setUsernameAndPassword(const std::string& username, const std::string& password);    /* 设置IP和端口 */    bool setFtpIPAndPort(const std::string& IP, const int port = 21);    /* 设置SFTP的IP和端口 */    bool setSftpIPAndPort(const std::string& IP, const int port = 22);    /* 设置是否忽略SSL证书,使用SFTP不建议忽略 */    void setIgnoreSSLCert(bool isIgnore);    /* 设置CA证书文件 */    void setCaCertFile(const std::string& caCertFile);    /* 设置是否启用CURL的调试信息 */    void enableCurlDebug(bool isPrint = false);        /* 列出文件列表 */    bool getFileList(std::string dir, std::vector<std::string>& fileList);    /* 获取文件夹列表 */    bool getDirList(std::string dir, std::vector<std::string>& dirList);    /* 判断文件夹是否存在 */    bool isDirExist(const std::string& dir);    /* 创建FTP文件夹 */    bool createDirectory(const std::string& ftpDir);    /* 创建FTP文件夹,递归创建 */    bool createDirectories(const std::string& ftpDir);    /* 下载文件 */    bool downloadFile(const std::string& remoteFile, const std::string& localFile, size_t timeout = 30);    /* 下载文件到数组 */    bool downloadToArray(const std::string& remoteFile,std::vector<char>& arrayInfo, size_t timeout = 30);    /* 上传文件 */    bool uploadFile(const std::string& localFile, const std::string& remoteFile, size_t timeout = 30, bool isCreateDir = false);    /* 上传文件,上传数据 */    bool uploadData(char* srcData, size_t size, const std::string& remoteFile, size_t timeout = 30, bool isCreateDir = false);private:    /* 列出所有内容 */    bool listAll(CURL* curl, std::string dir, std::vector<CF_FileInfo>& fileInfoList);    /* 检查FTP文件夹路径是否合规,不合规就修改 */    std::string checkDirPath(const std::string& dir);    /* 检查FTP文件路径是否合规 */    std::string checkFilePath(const std::string& file);    /* 检查本地文件夹是否存在,不存在则创建 */    bool checkLocalDir(const std::string& localDir);    /* 检查本地文件夹是否存在,不会创建 */    bool checkLocalDirExist(const std::string& localDir);    /* 检查本地文件是否存在 */    bool checkLocalFileExist(const std::string& localFile);    /* 执行curl,添加重试机制 */    bool performCurl(CURL* curl);    /* 重置curl设置 */    inline bool resetCurl(CURL* curl);    /* 设置sftp,如果是sftp就设置 */    inline bool setSftp(CURL* curl);    /* 检查FTP文件夹是否存在 */    bool checkFtpDirExist(const std::string& dir);    /* 检查SFTP文件夹是否存在 */    bool checkSftpDirExist(const std::string& dir);private:    std::mutex m_mutexCurl;                 /* curl互斥锁 */    std::string m_currentDir;               /* 当前目录 */    CURL* m_curl = nullptr;                 /* curl句柄 */    std::string m_IP;                       /* IP */    int m_port = 21;                        /* 端口 */    std::string m_ftpUrl;                   /* ftpUrl */    std::string m_username;    std::string m_password;    bool m_isSftp = false;                  /* 是否是SFTP */    bool m_isIgnoreSSLCert = false;         /* 是否忽略SSL证书 */    bool m_enableCurlDebug = false;         /* 是否打印调试信息 */    std::string m_caCertFile;               /* CA证书文件 */};#endif /* CURLFTP_H */
 |