利用curl下载文件(进度条显示) 代码片段

在项目中需要用到程序更新的功能,同事介绍说是curl中的开发库很不错,于是下载这个包测试了一下,确实不错。准备正式用到项目中,以下一个例子用于从互联网上抓取一个文件下载到本地,并加上进度条显示,做得挺简陋,不过功能差不多就这样了。
程序运行预览.
利用curl下载文件(进度条显示) 代码片段
 
首先需要加入多线程的机制,因为程序一边在下载文件,一边在显示进度条,单线程的方式肯定不行,所以我用到了wxTimer来实现,在downloadMain.h 中定义了一个wxTimer,并做了事件申明.
DECLARE_EVENT_TABLE()

 
 
利用curl下载文件(进度条显示) 代码片段/*************************************************************** 
利用curl下载文件(进度条显示) 代码片段 * Name:            downloadMain.h 
利用curl下载文件(进度条显示) 代码片段 * Purpose:     Defines Application Frame 
利用curl下载文件(进度条显示) 代码片段 * Author:         () 
利用curl下载文件(进度条显示) 代码片段 * Created:     2008-11-14 
利用curl下载文件(进度条显示) 代码片段 * Copyright:    () 
利用curl下载文件(进度条显示) 代码片段 * License: 
利用curl下载文件(进度条显示) 代码片段 **************************************************************/
 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段#ifndef DOWNLOADMAIN_H 
利用curl下载文件(进度条显示) 代码片段#define DOWNLOADMAIN_H 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段#include "downloadApp.h" 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段#include <wx/timer.h> 
利用curl下载文件(进度条显示) 代码片段#include "GUIDialog.h" 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段class downloadDialog: public GUIDialog 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        public
利用curl下载文件(进度条显示) 代码片段                downloadDialog(wxDialog *dlg); 
利用curl下载文件(进度条显示) 代码片段                ~downloadDialog(); 
利用curl下载文件(进度条显示) 代码片段                void .Timer(wxTimerEvent& event); 
利用curl下载文件(进度条显示) 代码片段        private
利用curl下载文件(进度条显示) 代码片段                virtual void .Close(wxCloseEvent& event); 
利用curl下载文件(进度条显示) 代码片段                virtual void .Quit(wxCommandEvent& event); 
利用curl下载文件(进度条显示) 代码片段                virtual void .About(wxCommandEvent& event); 
利用curl下载文件(进度条显示) 代码片段                void downloadfile(); 
利用curl下载文件(进度条显示) 代码片段                wxTimer* m_timerdown; 
利用curl下载文件(进度条显示) 代码片段                DECLARE_EVENT_TABLE() 
利用curl下载文件(进度条显示) 代码片段}; 
利用curl下载文件(进度条显示) 代码片段#endif // DOWNLOADMAIN_H
 
下面是主程序的代码.
利用curl下载文件(进度条显示) 代码片段/*************************************************************** 
利用curl下载文件(进度条显示) 代码片段 * Name:            downloadMain.cpp 
利用curl下载文件(进度条显示) 代码片段 * Purpose:     Code for Application Frame 
利用curl下载文件(进度条显示) 代码片段 * Author:         (alan) 
利用curl下载文件(进度条显示) 代码片段 * Created:     2008-11-14 
利用curl下载文件(进度条显示) 代码片段 * License: 
利用curl下载文件(进度条显示) 代码片段 **************************************************************/
 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段#ifdef WX_PRECOMP 
利用curl下载文件(进度条显示) 代码片段#include "wx_pch.h" 
利用curl下载文件(进度条显示) 代码片段#endif 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段#ifdef __BORLANDC__ 
利用curl下载文件(进度条显示) 代码片段#pragma hdrstop 
利用curl下载文件(进度条显示) 代码片段#endif //__BORLANDC__ 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段#include "downloadMain.h" 
利用curl下载文件(进度条显示) 代码片段#include <curl/curl.h> 
利用curl下载文件(进度条显示) 代码片段#include <curl/types.h> 
利用curl下载文件(进度条显示) 代码片段#include <curl/easy.h> 
利用curl下载文件(进度条显示) 代码片段#include "update.h" 
利用curl下载文件(进度条显示) 代码片段#include <wx/msgdlg.h> 
利用curl下载文件(进度条显示) 代码片段#include <wx/utils.h> 
利用curl下载文件(进度条显示) 代码片段#define TIMER_ID 22222 
利用curl下载文件(进度条显示) 代码片段//事件监听声明 
利用curl下载文件(进度条显示) 代码片段BEGIN_EVENT_TABLE(downloadDialog, GUIDialog) 
利用curl下载文件(进度条显示) 代码片段        EVT_TIMER(TIMER_ID, downloadDialog::OnTimer) 
利用curl下载文件(进度条显示) 代码片段END_EVENT_TABLE() 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段enum wxbuildinfoformat 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        short_f, long_f 
利用curl下载文件(进度条显示) 代码片段}; 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段wxString wxbuildinfo(wxbuildinfoformat format) 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        wxString wxbuild(wxVERSION_STRING); 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段        if (format == long_f ) 
利用curl下载文件(进度条显示) 代码片段        { 
利用curl下载文件(进度条显示) 代码片段#if defined(__WXMSW__) 
利用curl下载文件(进度条显示) 代码片段                wxbuild << _T("-Windows"); 
利用curl下载文件(进度条显示) 代码片段#elif defined(__WXMAC__) 
利用curl下载文件(进度条显示) 代码片段                wxbuild << _T("-Mac"); 
利用curl下载文件(进度条显示) 代码片段#elif defined(__UNIX__) 
利用curl下载文件(进度条显示) 代码片段                wxbuild << _T("-Linux"); 
利用curl下载文件(进度条显示) 代码片段#endif 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段#if wxUSE_UNICODE 
利用curl下载文件(进度条显示) 代码片段                wxbuild << _T("-Unicode build"); 
利用curl下载文件(进度条显示) 代码片段#else 
利用curl下载文件(进度条显示) 代码片段                wxbuild << _T("-ANSI build"); 
利用curl下载文件(进度条显示) 代码片段#endif // wxUSE_UNICODE 
利用curl下载文件(进度条显示) 代码片段        } 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段        return wxbuild; 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段//声明一个文件结构体 
利用curl下载文件(进度条显示) 代码片段struct FtpFile 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        char *filename; 
利用curl下载文件(进度条显示) 代码片段        FILE *stream; 
利用curl下载文件(进度条显示) 代码片段}; 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段downloadDialog::downloadDialog(wxDialog *dlg) 
利用curl下载文件(进度条显示) 代码片段                : GUIDialog(dlg) 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段        //创建一个定时器,制定TIMER_ID 
利用curl下载文件(进度条显示) 代码片段        m_timerdown = new wxTimer(this, TIMER_ID); 
利用curl下载文件(进度条显示) 代码片段        //定时器开始运行,这里会自动执行OnTimer函数 
利用curl下载文件(进度条显示) 代码片段        m_timerdown->Start(100); 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段downloadDialog::~downloadDialog() 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段//定时器操作 
利用curl下载文件(进度条显示) 代码片段void downloadDialog::OnTimer(wxTimerEvent &event
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        downloadfile(); 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段//文件写入流 
利用curl下载文件(进度条显示) 代码片段int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        struct FtpFile *out=(struct FtpFile *)stream; 
利用curl下载文件(进度条显示) 代码片段        if (out && !out->stream) 
利用curl下载文件(进度条显示) 代码片段        { 
利用curl下载文件(进度条显示) 代码片段                out->stream=fopen(out->filename, "wb"); 
利用curl下载文件(进度条显示) 代码片段                if (!out->stream) 
利用curl下载文件(进度条显示) 代码片段                { 
利用curl下载文件(进度条显示) 代码片段                        return -1; 
利用curl下载文件(进度条显示) 代码片段                } 
利用curl下载文件(进度条显示) 代码片段        } 
利用curl下载文件(进度条显示) 代码片段        return fwrite(buffer, size, nmemb, out->stream); 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段//进度条显示函数 
利用curl下载文件(进度条显示) 代码片段int wxcurldav_dl_progress_func(void* ptr, double rDlTotal, double rDlNow, double rUlTotal, double rUlNow) 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段                                wxGauge* pGauge = (wxGauge*) ptr; 
利用curl下载文件(进度条显示) 代码片段                                if(pGauge) 
利用curl下载文件(进度条显示) 代码片段                                //设置进度条的值 
利用curl下载文件(进度条显示) 代码片段                                        pGauge->SetValue(100.0 * (rDlNow/rDlTotal)); 
利用curl下载文件(进度条显示) 代码片段                                return 0; 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段//下载文件函数 
利用curl下载文件(进度条显示) 代码片段void downloadDialog::downloadfile() 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        //创建curl对象 
利用curl下载文件(进度条显示) 代码片段        CURL *curl; 
利用curl下载文件(进度条显示) 代码片段        CURLcode res; 
利用curl下载文件(进度条显示) 代码片段        m_staticText2->SetLabel(wxT("请耐心等待程序下载更新包...")); 
利用curl下载文件(进度条显示) 代码片段        struct FtpFile ftpfile= 
利用curl下载文件(进度条显示) 代码片段        { 
利用curl下载文件(进度条显示) 代码片段                //定义下载到本地的文件位置和路径 
利用curl下载文件(进度条显示) 代码片段                "tmp.exe",NULL 
利用curl下载文件(进度条显示) 代码片段        }; 
利用curl下载文件(进度条显示) 代码片段        curl_global_init(CURL_GLOBAL_DEFAULT); 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段        //curl初始化 
利用curl下载文件(进度条显示) 代码片段        curl = curl_easy_init(); 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段        //curl对象存在的情况下执行操作 
利用curl下载文件(进度条显示) 代码片段        if (curl) 
利用curl下载文件(进度条显示) 代码片段        { 
利用curl下载文件(进度条显示) 代码片段                //设置远端地址 
利用curl下载文件(进度条显示) 代码片段                curl_easy_setopt(curl, CURLOPT_URL,"http://dl_dir.qq.com/minigamefile/QQGame2008ReleaseP2_web_setup.EXE"); 
利用curl下载文件(进度条显示) 代码片段                //执行写入文件流操作 
利用curl下载文件(进度条显示) 代码片段                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); 
利用curl下载文件(进度条显示) 代码片段                curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); 
利用curl下载文件(进度条显示) 代码片段                //curl的进度条声明 
利用curl下载文件(进度条显示) 代码片段                curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE); 
利用curl下载文件(进度条显示) 代码片段                //回调进度条函数 
利用curl下载文件(进度条显示) 代码片段                curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, wxcurldav_dl_progress_func); 
利用curl下载文件(进度条显示) 代码片段                //设置进度条名称 
利用curl下载文件(进度条显示) 代码片段                curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, m_gauge1); 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段                //进度条 
利用curl下载文件(进度条显示) 代码片段                m_gauge1->SetValue(0); 
利用curl下载文件(进度条显示) 代码片段                //写入文件 
利用curl下载文件(进度条显示) 代码片段                res = curl_easy_perform(curl); 
利用curl下载文件(进度条显示) 代码片段                m_gauge1->SetValue(100); 
利用curl下载文件(进度条显示) 代码片段                //释放curl对象 
利用curl下载文件(进度条显示) 代码片段                curl_easy_cleanup(curl); 
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段                if (CURLE_OK != res) 
利用curl下载文件(进度条显示) 代码片段                        ; 
利用curl下载文件(进度条显示) 代码片段        } 
利用curl下载文件(进度条显示) 代码片段        if (ftpfile.stream) 
利用curl下载文件(进度条显示) 代码片段        { 
利用curl下载文件(进度条显示) 代码片段                //关闭文件流 
利用curl下载文件(进度条显示) 代码片段                fclose(ftpfile.stream); 
利用curl下载文件(进度条显示) 代码片段        } 
利用curl下载文件(进度条显示) 代码片段                //释放全局curl对象 
利用curl下载文件(进度条显示) 代码片段                curl_global_cleanup(); 
利用curl下载文件(进度条显示) 代码片段                //这一步很重要,停止定时器,不然程序会无休止的运行下去 
利用curl下载文件(进度条显示) 代码片段                m_timerdown->Stop(); 
利用curl下载文件(进度条显示) 代码片段                //执行刚下载完毕的程序,进行程序更新 
利用curl下载文件(进度条显示) 代码片段                int pid = ::wxExecute(_T("tmp.exe")); 
利用curl下载文件(进度条显示) 代码片段                wxMessageBox(wxT("下载完毕,程序开始执行更新操作......")); 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段void downloadDialog::OnClose(wxCloseEvent &event
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        Destroy(); 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段void downloadDialog::OnQuit(wxCommandEvent &event
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段        Destroy(); 
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段void downloadDialog::OnAbout(wxCommandEvent &event
利用curl下载文件(进度条显示) 代码片段
利用curl下载文件(进度条显示) 代码片段 
利用curl下载文件(进度条显示) 代码片段
上一篇:【区块链之技术进阶】掰一掰区块链共识机制与分布式一致性算法


下一篇:CB Insights 发布全球最佳 AI 企业 Top 100 ,哪些自动驾驶公司上了榜?