• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            [原創(chuàng)]封裝了個基于Libcurl的類,大家評評,盡情拍磚.

            [原創(chuàng)]封裝了個基于Libcurl的類,
            大家評評,盡情拍磚.
              1 #pragma once
              2 #include <iostream>
              3 #include <sys/types.h>
              4 #include <sys/stat.h>
              5 #include "curl/curl.h"
              6 #include "curl/types.h"
              7 #include "curl/easy.h"
              8 #pragma comment(lib, "curl/libcurl.lib");
              9 struct CURL_FtpFile {
             10   const char *filename;
             11   FILE *stream;
             12 };
             13 
             14 template<typename T>
             15 class CFtpClient{
             16 public:
             17     bool m_bDebug;
             18     char m_szFtpHost[1024];
             19     char m_szFtpUSERPWD[256];
             20     CFtpClient();
             21     bool close();
             22     bool open(char szFtpHost[],char szFtpUserName[],char szFtpPassword[],int nPort=21);
             23     bool GetFile(char szRemoteFileName[],char szLocalFileName[] ,T* pT=NULL);
             24     bool PutFile(char szLocalFileName[] ,char szRemoteFileName[],T* pT=NULL);
             25     bool RemoveFile(char szRemoteFileName[]);
             26     bool RemoveDir(char szRemoteDirectory[]);
             27 
             28     size_t GetLocalFileSize(char* szFileName);
             29 
             30 private:
             31     static size_t ReadLocalFileFunc (void *ptr, size_t size, size_t nmemb, void *stream);
             32     static size_t WriteLocalFileFunc(void *buffer, size_t size, size_t nmemb, void *stream);
             33     static int PutFileProgressFunc(void   *clientp,
             34                                     double dltotal,
             35                                     double dlnow,
             36                                     double ultotal, //上傳:總大小
             37                                     double ulnow    //上傳:當(dāng)前大小
             38                                     );
             39 
             40     static int GetFileProgressFunc(void   *clientp,
             41                                     double dltotal,  //下載:當(dāng)前大小
             42                                     double dlnow,    //下載:當(dāng)前大小
             43                                     double ultotal,
             44                                     double ulnow);
             45 };
             46 
             47 
             48 template<typename T>
             49 CFtpClient<T>::CFtpClient(void):m_bDebug(false)
             50 {
             51 }
             52 
             53 template<typename T>
             54 bool CFtpClient<T>::open(char szFtpHost[],char szFtpUserName[],char szFtpPassword[],int nPort) {
             55     sprintf(m_szFtpHost,"ftp://%s:%d/",szFtpHost,nPort);
             56     sprintf(m_szFtpUSERPWD,"%s:%s",szFtpUserName,szFtpPassword);
             57     curl_global_init(CURL_GLOBAL_DEFAULT);
             58     return true;
             59 }
             60 
             61 template<typename T>
             62 bool CFtpClient<T>::close() {
             63     curl_global_cleanup();
             64     return true;
             65 }
             66 
             67 //FTP回調(diào)函數(shù):讀
             68 template<typename T>
             69 size_t CFtpClient<T>::ReadLocalFileFunc(void *ptr, size_t size, size_t nmemb, void *stream) {
             70     return fread(ptr, size, nmemb, (FILE *)stream) * size;
             71 }
             72 
             73 //FTP回調(diào)函數(shù):寫
             74 template<typename T>
             75 size_t CFtpClient<T>::WriteLocalFileFunc(void *buffer, size_t size, size_t nmemb, void *stream) {
             76     struct CURL_FtpFile *out=(struct CURL_FtpFile *)stream;
             77     if(out && !out->stream) {
             78         out->stream=fopen(out->filename, "wb");
             79         if(!out->stream)
             80             return -1; /* failure, can't open file to write */
             81     }
             82     return fwrite(buffer, size, nmemb, out->stream);
             83 }
             84 
             85 template<typename T>
             86 int CFtpClient<T>::PutFileProgressFunc(void  *clientp,
             87                                     double dltotal,
             88                                     double dlnow,
             89                                     double ultotal, //上傳:總大小
             90                                     double ulnow    //上傳:當(dāng)前大小
             91                                     )
             92 {
             93     T *pT = (T*)clientp;
             94     return pT->uploading(ulnow,ultotal);
             95 }
             96 
             97 template<typename T>
             98 int CFtpClient<T>::GetFileProgressFunc(void *clientp,
             99                                     double dltotal,  //下載:總大小
            100                                     double dlnow,    //下載:當(dāng)前大小
            101                                     double ultotal,
            102                                     double ulnow)
            103 
            104 {
            105     T *pT = (T*)clientp;
            106     return pT->downloading(dlnow,dltotal);
            107 }
            108 
            109 
            110 //獲取本地文件的大小
            111 template<typename T>
            112 size_t CFtpClient<T>::GetLocalFileSize(char* szFileName) {
            113     struct stat f_stat;
            114     if (stat(szFileName, &f_stat) == -1) {
            115         return -1;
            116     }
            117     return (size_t)f_stat.st_size;
            118 }
            119 
            120 template<typename T>
            121 bool CFtpClient<T>::GetFile(char szRemoteFileName[],char szLocalFileName[] ,T* pT) {
            122     CURL* curl;
            123     CURLcode res = CURL_LAST;
            124 
            125     curl = curl_easy_init();
            126     if (curl == NULL) {
            127         return false;
            128     }
            129     curl_easy_setopt(curl, CURLOPT_USERPWD, m_szFtpUSERPWD);
            130 
            131     //得到全路徑文件名
            132     char szRemoteFullPathFileName[1024];
            133     strcat(szRemoteFullPathFileName,m_szFtpHost);
            134     strcat(szRemoteFullPathFileName,szRemoteFileName);
            135 
            136     struct CURL_FtpFile ftpLocalFile={
            137         szLocalFileName,
            138         NULL
            139     };
            140 
            141     //設(shè)置遠(yuǎn)程URL
            142     curl_easy_setopt(curl, CURLOPT_URL,szRemoteFullPathFileName);
            143 
            144     //設(shè)置回調(diào)函數(shù)
            145     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CFtpClient::WriteLocalFileFunc);
            146     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpLocalFile);
            147     if (pT !=NULL){
            148         curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
            149         curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CFtpClient::GetFileProgressFunc);
            150         curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,pT);
            151     }
            152 
            153     res = curl_easy_perform(curl);
            154     curl_easy_cleanup(curl);
            155     if (ftpLocalFile.stream){
            156         fclose(ftpLocalFile.stream);
            157     }
            158     if (res != CURLE_OK){
            159         return false;
            160     }
            161     return true;
            162 }
            163 
            164 template<typename T>
            165 bool CFtpClient<T>::PutFile(char szLocalFileName[] ,char szRemoteFileName[],T* pT)
            166 {
            167     if (strlen(szLocalFileName)<1  || strlen(szRemoteFileName) <1) {
            168         return false;
            169     }
            170     CURL* curl;
            171     CURLcode res = CURL_LAST;
            172 
            173     curl = curl_easy_init();
            174     if (curl == NULL) {
            175         return false;
            176     }
            177     FILE* pLocalFile;
            178     pLocalFile = fopen(szLocalFileName,"rb");
            179     if (pLocalFile==NULL) {
            180         return false;
            181     }
            182     char szRemoteFullPathFileName[2048];
            183     memset(szRemoteFullPathFileName,'\0',2048);
            184     strcat(szRemoteFullPathFileName,m_szFtpHost);
            185     strcat(szRemoteFullPathFileName,szRemoteFileName);
            186 
            187     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
            188     curl_easy_setopt(curl, CURLOPT_URL, szRemoteFullPathFileName);
            189     curl_easy_setopt(curl, CURLOPT_USERPWD,m_szFtpUSERPWD);
            190     curl_easy_setopt(curl, CURLOPT_READDATA, pLocalFile);
            191     curl_easy_setopt(curl, CURLOPT_READFUNCTION,CFtpClient::ReadLocalFileFunc);
            192     //curl_easy_setopt(curl, CURLOPT_INFILESIZE ,GetLocalFileSize(szLocalFullPathFileName));
            193     curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,(curl_off_t)GetLocalFileSize(szLocalFileName));
            194     curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
            195     if (this->m_bDebug){
            196         curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
            197     }
            198 
            199     //設(shè)置進(jìn)度處理
            200     if (pT !=NULL){
            201         curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
            202         curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CFtpClient::PutFileProgressFunc);
            203         curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,pT);
            204     }
            205     res = curl_easy_perform(curl);
            206     curl_easy_cleanup(curl);
            207     if (pLocalFile) {
            208         fclose(pLocalFile);
            209     }
            210     //用戶取消
            211     if (res == CURLE_ABORTED_BY_CALLBACK){
            212         this->RemoveFile(szRemoteFileName);
            213         return false;
            214     }
            215 
            216     if (res != CURLE_OK) {
            217         return false;
            218     }
            219     return true;
            220 }
            221 
            222 // 刪除文件
            223 template<typename T>
            224 bool CFtpClient<T>::RemoveFile(char szRemoteFileName[])
            225 {
            226     CURL* curl;
            227     CURLcode res = CURL_LAST;
            228     curl = curl_easy_init();
            229     if (curl == NULL) {
            230         return false;
            231     }
            232     struct curl_slist *headerlist=NULL;
            233     char szCmd[1024] = "DELE ";
            234 
            235     strcat(szCmd,szRemoteFileName);
            236 
            237     headerlist = curl_slist_append(headerlist, szCmd);
            238     curl_easy_setopt(curl, CURLOPT_URL,m_szFtpHost);
            239     curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
            240     curl_easy_setopt(curl, CURLOPT_USERPWD, m_szFtpUSERPWD);
            241     res = curl_easy_perform(curl);
            242     curl_easy_cleanup(curl);
            243     return (res == CURLE_OK);
            244 }
            245 
            246 // 刪除目錄
            247 template<typename T>
            248 bool CFtpClient<T>::RemoveDir(char szRemoteDirectory[])
            249 {
            250     CURL* curl;
            251     CURLcode res = CURL_LAST;
            252     curl = curl_easy_init();
            253     if (curl == NULL) {
            254         return false;
            255     }
            256     struct curl_slist *headerlist=NULL;
            257     char szCmd[1024] = "RMD ";
            258     strcat(szCmd,szRemoteDirectory);
            259     headerlist = curl_slist_append(headerlist, szCmd);
            260     curl_easy_setopt(curl, CURLOPT_URL,m_szFtpHost);
            261     curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
            262     curl_easy_setopt(curl, CURLOPT_USERPWD, m_szFtpUSERPWD);
            263     if (this->m_bDebug){
            264         curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
            265     }
            266     res = curl_easy_perform(curl);
            267     curl_easy_cleanup(curl);
            268     return (res == CURLE_OK);
            269 }
            270 


            posted on 2010-11-18 14:15 天下 閱讀(5293) 評論(6)  編輯 收藏 引用 所屬分類: C/C++Win32Socket

            評論

            # re: [原創(chuàng)]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 15:46 gaimor

            這是什么啊??  回復(fù)  更多評論   

            # re: [原創(chuàng)]封裝了個基于Libcurl的類,大家評評,盡情拍磚.[未登錄] 2010-11-18 16:31 我要去桂林


            多謝分享  回復(fù)  更多評論   

            # re: [原創(chuàng)]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 16:39 不宜過熱恩

            沒看明白,模板用在這里是和用途?  回復(fù)  更多評論   

            # re: [原創(chuàng)]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 17:32 天下

            @不宜過熱恩

            模板在這里的作用:
            比如:
            CXXXDialog中
            public:
            CFtpClient m_ftpClient<CXXXDialog>;

            m_ftpClient.PutFile(szLocalFileName,szRemoteFileName,this);

            //用于進(jìn)度回調(diào).
            CXXXDialog::uploading(double ulnow,double ultotal)
            {
            }

            見:
            bool CFtpClient<T>::PutFile(char szLocalFileName[] ,char szRemoteFileName[],T* pT)

            if (pT !=NULL){
            curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
            curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CFtpClient::GetFileProgressFunc);
            curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,pT);
            }  回復(fù)  更多評論   

            # re: [原創(chuàng)]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 17:33 天下

            @不宜過熱恩
            int CFileProgressDialog::uploading(double ulnow, double ultotal)
            {
            if (m_bIsCancel){
            return 1;
            }
            int nPercent = (int)(ulnow*100/ultotal);
            m_prsPercent.SetPos(nPercent);

            CString strText;
            strText.Format(_T("%d%%"),nPercent);
            GetDlgItem(IDC_STATIC_PERCENT)->SetWindowText(strText);
            return 0;
            }  回復(fù)  更多評論   

            # re: [原創(chuàng)]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-20 23:41 shaker(太子)

            如果僅僅是這樣的話 不應(yīng)該被稱之為封裝libcurl吧?  回復(fù)  更多評論   

            <2012年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            色综合久久无码中文字幕| 久久伊人色| 久久天堂电影网| 精品国产热久久久福利| 久久久久黑人强伦姧人妻| 久久精品视频一| MM131亚洲国产美女久久| 91久久精品国产成人久久| 亚洲精品成人网久久久久久| 超级97碰碰碰碰久久久久最新| 无码AV波多野结衣久久| 99久久国产综合精品网成人影院| 久久久久亚洲精品天堂久久久久久 | 性做久久久久久久久老女人| 久久精品国产精品亚洲精品| 日本精品久久久久中文字幕| 亚洲国产精品综合久久一线| 精品久久人妻av中文字幕| 久久久久国产一区二区| 久久99国产乱子伦精品免费| 色综合久久中文字幕综合网 | 韩国三级中文字幕hd久久精品| 久久人人添人人爽添人人片牛牛| 久久国产精品久久国产精品| 精品国产乱码久久久久久呢| 国产精品美女久久久网AV| 午夜天堂av天堂久久久| 欧美色综合久久久久久 | 亚洲欧美国产精品专区久久| 2021精品国产综合久久| 国产精品乱码久久久久久软件| 久久亚洲高清观看| 国产69精品久久久久久人妻精品| 久久精品国产黑森林| 久久91亚洲人成电影网站| 亚洲综合熟女久久久30p| 欧美精品福利视频一区二区三区久久久精品 | 久久天天躁狠狠躁夜夜av浪潮 | 久久久精品久久久久特色影视| 91精品国产乱码久久久久久| 久久www免费人成看片|