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

 
/*************************************************************** 
 * Name:            downloadMain.h 
 * Purpose:     Defines Application Frame 
 * Author:         () 
 * Created:     2008-11-14 
 * Copyright:    () 
 * License: 
 **************************************************************/ 
 
#ifndef DOWNLOADMAIN_H 
#define DOWNLOADMAIN_H 
 
 
 
#include "downloadApp.h" 
 
 
#include <wx/timer.h> 
#include "GUIDialog.h" 
 
class downloadDialog: public GUIDialog 

        public: 
                downloadDialog(wxDialog *dlg); 
                ~downloadDialog(); 
                void .Timer(wxTimerEvent& event); 
        private: 
                virtual void .Close(wxCloseEvent& event); 
                virtual void .Quit(wxCommandEvent& event); 
                virtual void .About(wxCommandEvent& event); 
                void downloadfile(); 
                wxTimer* m_timerdown; 
                DECLARE_EVENT_TABLE() 
}; 
#endif // DOWNLOADMAIN_H
下面是主程序的代码.
/*************************************************************** 
 * Name:            downloadMain.cpp 
 * Purpose:     Code for Application Frame 
 * Author:         (alan) 
 * Created:     2008-11-14 
 * License: 
 **************************************************************/ 
 
#ifdef WX_PRECOMP 
#include "wx_pch.h" 
#endif 
 
#ifdef __BORLANDC__ 
#pragma hdrstop 
#endif //__BORLANDC__ 
 
#include "downloadMain.h" 
#include <curl/curl.h> 
#include <curl/types.h> 
#include <curl/easy.h> 
#include "update.h" 
#include <wx/msgdlg.h> 
#include <wx/utils.h> 
#define TIMER_ID 22222 
//事件监听声明 
BEGIN_EVENT_TABLE(downloadDialog, GUIDialog) 
        EVT_TIMER(TIMER_ID, downloadDialog::OnTimer) 
END_EVENT_TABLE() 
 
enum wxbuildinfoformat 

        short_f, long_f 
}; 
 
wxString wxbuildinfo(wxbuildinfoformat format) 

        wxString wxbuild(wxVERSION_STRING); 
 
        if (format == long_f ) 
        { 
#if defined(__WXMSW__) 
                wxbuild << _T("-Windows"); 
#elif defined(__WXMAC__) 
                wxbuild << _T("-Mac"); 
#elif defined(__UNIX__) 
                wxbuild << _T("-Linux"); 
#endif 
 
#if wxUSE_UNICODE 
                wxbuild << _T("-Unicode build"); 
#else 
                wxbuild << _T("-ANSI build"); 
#endif // wxUSE_UNICODE 
        } 
 
        return wxbuild; 

 
//声明一个文件结构体 
struct FtpFile 

        char *filename; 
        FILE *stream; 
}; 
 
downloadDialog::downloadDialog(wxDialog *dlg) 
                : GUIDialog(dlg) 

 
        //创建一个定时器,制定TIMER_ID 
        m_timerdown = new wxTimer(this, TIMER_ID); 
        //定时器开始运行,这里会自动执行OnTimer函数 
        m_timerdown->Start(100); 

 
downloadDialog::~downloadDialog() 

 

//定时器操作 
void downloadDialog::OnTimer(wxTimerEvent &event) 

        downloadfile(); 

//文件写入流 
int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) 

        struct FtpFile *out=(struct FtpFile *)stream; 
        if (out && !out->stream) 
        { 
                out->stream=fopen(out->filename, "wb"); 
                if (!out->stream) 
                { 
                        return -1; 
                } 
        } 
        return fwrite(buffer, size, nmemb, out->stream); 

//进度条显示函数 
int wxcurldav_dl_progress_func(void* ptr, double rDlTotal, double rDlNow, double rUlTotal, double rUlNow) 

                                wxGauge* pGauge = (wxGauge*) ptr; 
                                if(pGauge) 
                                //设置进度条的值 
                                        pGauge->SetValue(100.0 * (rDlNow/rDlTotal)); 
                                return 0; 

//下载文件函数 
void downloadDialog::downloadfile() 

        //创建curl对象 
        CURL *curl; 
        CURLcode res; 
        m_staticText2->SetLabel(wxT("请耐心等待程序下载更新包...")); 
        struct FtpFile ftpfile= 
        { 
                //定义下载到本地的文件位置和路径 
                "tmp.exe",NULL 
        }; 
        curl_global_init(CURL_GLOBAL_DEFAULT); 
 
        //curl初始化 
        curl = curl_easy_init(); 
 
        //curl对象存在的情况下执行操作 
        if (curl) 
        { 
                //设置远端地址 
                curl_easy_setopt(curl, CURLOPT_URL,"http://dl_dir.qq.com/minigamefile/QQGame2008ReleaseP2_web_setup.EXE"); 
                //执行写入文件流操作 
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); 
                curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); 
                //curl的进度条声明 
                curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE); 
                //回调进度条函数 
                curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, wxcurldav_dl_progress_func); 
                //设置进度条名称 
                curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, m_gauge1); 
 
                //进度条 
                m_gauge1->SetValue(0); 
                //写入文件 
                res = curl_easy_perform(curl); 
                m_gauge1->SetValue(100); 
                //释放curl对象 
                curl_easy_cleanup(curl); 
 
                if (CURLE_OK != res) 
                        ; 
        } 
        if (ftpfile.stream) 
        { 
                //关闭文件流 
                fclose(ftpfile.stream); 
        } 
                //释放全局curl对象 
                curl_global_cleanup(); 
                //这一步很重要,停止定时器,不然程序会无休止的运行下去 
                m_timerdown->Stop(); 
                //执行刚下载完毕的程序,进行程序更新 
                int pid = ::wxExecute(_T("tmp.exe")); 
                wxMessageBox(wxT("下载完毕,程序开始执行更新操作......")); 

void downloadDialog::OnClose(wxCloseEvent &event) 

        Destroy(); 

 
void downloadDialog::OnQuit(wxCommandEvent &event) 

        Destroy(); 

 
void downloadDialog::OnAbout(wxCommandEvent &event) 

 

本文转自阿汐 51CTO博客,原文链接:http://blog.51cto.com/axiii/112836,如需转载请自行联系原作者

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

  1. ajax实现下载文件进度条及方法详解

    javascript使用ajax下载文件进度条实现 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&qu ...

  2. java 下载文件 进度条_使用处理程序下载文件时显示百分比的进度条

    我想在按钮上单击下载 .EXE 文件并在网页上显示下载进度条而不是浏览器进度条 . 这个开发背后的想法是浏览器在他的下载管理器中隐藏它的下载进度条 . 我想在下载达到100%后自动运行.EXE . 我 ...

  3. java 下载文件 进度条_java – 从服务器下载文件时显示进度条

    如果我很了解你,你想显示一个进度条,直到你的服务器准备好发送一个文件,而不是显示蜜蜂下载的文件的进度. 如果是这样,你正在处理艰难的练习.一个可靠的进度条需要知道(相当准确)你在做什么以及需要多长时间 ...

  4. libcurl+ncurses 分段range批量下载和进度条显示源码实例

    这个例子来自参考文献[1], 那里有很多小bug,我都做了修改,在这里不一一说明了.ncurse界面编程比较容易入门,就是几个接口,网上资料很多,这里不详述了. //gcc -g mget.c -o ...

  5. 异步下载圆形进度条显示进度

    圆形进度条参考链接即可:使用css3实现圆形进度条 需求点击下载后遮罩层显示下载进度: 1.圆形进度条参考以上链接,有点小瑕疵,可更改定位距离实现重合. 2.遮罩层: .lbOverlay{ disp ...

  6. android会员等级进度条,jQuery会员等级进度条显示代码

    js代码 $(function(){ var geshu = $(".djwai").children(".dengji").length; // alert( ...

  7. CURL下载文件简易进度条

    背景 curl下载文件比较方便,sample里的进度打印比较鸡肋,网上搜了一下C打印进度条,随便改改,就ok了,代码贴起来! curl 回调函数进度打印输出 int download_progress ...

  8. php flash上传进度条,PHP_PHP+FLASH实现上传文件进度条相关文件 下载,PHP之所以很难实现上传进度条 - phpStudy...

    PHP+FLASH实现上传文件进度条相关文件 下载 PHP之所以很难实现上传进度条是因为在我们上传文件到服务器的时候,要等到文件全部送到服务器之后,才执行相应的php文件.在这之前,文件数据保存在一个 ...

  9. 使用Http下载文件并实时显示进度 --转载

    转载​​​​​​ Qt中使用Http下载文件并实时显示进度 - 知乎 前几天写了一篇关于Http通讯进行GET.POST的操作,那么,今天的这篇文章也是基于Http通讯的,但是功能不同. 当前文章讲解 ...

最新文章

  1. CCleaner v5.55.7108 发布,新增软件升级功能
  2. 一个古老而优雅的电子线路
  3. C 语言编程 — 头文件
  4. Android 手势解锁 GestureLock的使用和简单修复
  5. GridView 中设置某列,截取字符串加... 和 鼠标放上去字符全部显示
  6. php自动生成mysql的触发代码。
  7. Linux C Socket编程,这篇文章让我耳目一新
  8. [解题报告]HDU 2019 数列有序!
  9. HTML5 新属性的讲解
  10. 记录小新pro13 Intel版(S540-13IML)安装hackintosh的一些要点
  11. 找不到服务器或应用项目,word中文档时提示“找不到服务器应用程序、源文件或项目”有...-office软件找不到word文档,officewo...
  12. Ubuntu安装微软雅黑字体
  13. 在方框里打勾 microsoft office
  14. C++ #include expects “FILENAME“ or <FILENAME>
  15. Linux Ubuntu NFS 调试,Arm 挂载命令
  16. 全新剪映专业版140内测版!等你体验!
  17. 【MRI】解决DPABI计算功能连接时路径冲突
  18. 奇偶校验(Parity Check)
  19. 【095期】网易二面:Kafka 为什么吞吐量大、速度快?
  20. 第四代iPod Touch iOS5.1不完美越狱教程

热门文章

  1. 面试热点Redis分布式锁,再细说一次
  2. JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!
  3. Spring Boot 异步请求和异步调用
  4. 恕我直言,IDEA 的 Debug 调试,你可能只用了 10%
  5. 数据库分库分表,何时分?怎样分?
  6. 终于有人把云计算、物联网和大数据讲明白了!
  7. 每天生产45亿词!GPT-3已渗透进300+应用中,网友:边吃边拉
  8. 他智商167,超过爱因斯坦,花17年炸遍美国高校,却因一疏漏被捕
  9. 深度学习准「研究僧」预习资料:图灵奖得主Yann LeCun《深度学习(Pytorch)》春季课程...
  10. Nginx 之父被拘留,时隔15年后,前老板提起了版权侵权诉讼!