本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177

下载地址获得了,那就下载吧。最简单的,URLDownloadToFile。如何显示进度呢?URLDownloadToFile提供了一个回调,实现这个回调就可以了

STDMETHODIMP CDownloadFileByHttp::OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
{m_eaz->downloadBytes = ulProgress;return S_OK;
}

解决了!

但问题又来了,一个镜像2.2G,下载速度200K,要下载3个小时!体验也太差了些。我用迅雷试了一下,可以达到1.4M!看来需要多线程下载啊。

怎么多线程呢?解决方法有两个,一个是像迅雷一样对单个文件多线程下载,这需要服务器支持。另外一个就是讲镜像文件分割,然后同时下载多个小文件。第二个方法有个好处,就是如果中途程序退出了,已经下载的完整文件不需要再下载了。所以选择第二种方法。

于是又改代码,开了5个线程,同时下载5个文件。但是奇怪的是,只有两个文件同时下载。超过两个URLDownloadToFile就返回错误。不解。google一下,原来是ie的限制。ie缺省就只能同时下载2个。晕。怎么办呢?修改ie设置?可是ie版本那么多,都要去改很麻烦。而且修改ie设置的时候估计360又得弹框了,改也改不了。怎么办呢?

又google。找到迅雷sdk库,将sdk集成进来后,安装包大了0.5M,可实验了一下,效果不理想。因为下载单个文件的时候,迅雷sdk是单线程下载,根本不会提高下载速度,而且必须要安装迅雷。另外在托盘处会弹出下载速度,可是速度经常不更新,不靠谱。

于是又google,这下找到一个下载库,libcurl。看了一下例子,调用起来很简单。而且multithread例子很适合,就把这个例子改了改,集成到程序里面去,效果很好。推荐以后下载就用这个库,而且稍稍将multithread例子改一下,就可以支持多线程下载一个文件。

size_t CDownloadFileByHttp::write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{CDownloadFileByHttp *htt = (CDownloadFileByHttp *)stream;size_t written = fwrite(ptr, size, nmemb, htt->m_pagefile);htt->m_eaz->downloadBytes += written;return written;
}BOOL CDownloadFileByHttp::DownloadFile()
{BOOL ret = FALSE;CStringA aurl = CW2A(m_url);CURL *curl;curl = curl_easy_init();curl_easy_setopt(curl, CURLOPT_URL, aurl.GetBuffer()); aurl.ReleaseBuffer();curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CDownloadFileByHttp::write_data);CStringA afile = CW2A(m_downloadFilePath);m_pagefile = fopen(afile.GetBuffer(), "wb"); afile.ReleaseBuffer();if (m_pagefile)curl_easy_setopt(curl, CURLOPT_FILE, this);elsegoto RETURN;int i = 0;while ( i < 5 ){if (0 == curl_easy_perform(curl)){m_status = DOWNLOADED;m_eaz->status = DOWNLOADED;m_eaz->downloadBytes = m_eaz->size;TheDownloadManagerHelper.OneFileDownloaded(m_eaz);LOGEx(L"一个文件下载完成: " + m_downloadFilePath);ret = TRUE;goto RETURN;}else{CString msg;msg.Format(L"Error: Http下载文件失败, file = %s, errorcode = %d", m_downloadFilePath.GetBuffer(), GetLastError());m_downloadFilePath.ReleaseBuffer();LOGEx(msg);m_eaz->downloadBytes = 0;i++;}}m_eaz->status = NOT_DOWNLOAD;LOGEx(L"Error: Http下载文件失败: " + m_downloadFilePath);TheDownloadManagerHelper.m_errorCode = -7; // Http下载文件失败RETURN:curl_easy_cleanup(curl);if (m_pagefile)fclose(m_pagefile);return ret;
}

跑了一下,速度达到了1.4M,和迅雷一样! 好高兴,哈哈

小妞会装机 -- 一个装机软件的开发笔记(六)相关推荐

  1. JNI开发笔记(六)--一种更规范的so库生成方法

    一种更规范的JNI工程写法 引 前言 1. MainActivity中的两个重要的语句 2. 建立Util类来替代MainActivity 3. 在MainActivity中验证JNI工程并生成so库 ...

  2. 小妞会装机 -- 一个装机软件的开发笔记( 三)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 界面基本山确定下来,感觉操作起来的确很简单, ...

  3. 小妞会装机 -- 一个装机软件的开发笔记 (一)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 见很多人不会装系统,拿了ghost盘也还是不 ...

  4. 小妞会装机 -- 一个装机软件的开发笔记 (二)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 要做一个操作非常简单的装机软件.简单到什么程 ...

  5. 小妞会装机 -- 一个装机软件的开发笔记(七)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 用libcurl解决了下载的问题,用duil ...

  6. 小妞会装机 -- 一个装机软件的开发笔记(八)

    做好了这个软件后,我很高兴,因为我以前没有用过dui,而通过做这个软件学习并使用了dui技术,尽管这个软件只有一些非常简单的界面元素.dui让我以后的软件开发多了一个选择.通过这个软件的实践,我觉得不 ...

  7. 小妞会装机 -- 一个装机软件的开发笔记(五)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 因为界面元素很少,所以界面开发很简单.现在讲 ...

  8. 小妞会装机 -- 一个装机软件的开发笔记( 四)

    本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177 界面的xml配好后,就开始写实现代码.先上代 ...

  9. 软件设计开发笔记1:基于状态机的程序设计

      在编码实现的过程中,我们会经常使用到条件判断结构,而且使用起来很方便.但是在需要转移的状态比较多,或是条件比较复杂时,我们就可能需要很长的条件判断结构来处理.不过,过于复杂的条件判断结构会给代码的 ...

最新文章

  1. Android Studio之编译提示\app\src\main\res\values\colors.xml:1:1 Error:前言有不允许的内容
  2. python小老鼠编程_邯郸pythonnot学习费用多少
  3. hadoop 单机单间_Hadoop单机模式配置
  4. “不会Linux,会有什么影响?”资深程序员:基本等于自废武功!
  5. Python实践基于直方图的梯度提升集成方法
  6. 修改本地数据库root权限密码
  7. 小h的数列 //差分前缀和的应用(好好看好好学(包括我自己))
  8. 三角形状的点阵模糊效果iOS源码
  9. 有哪些让程序员受益终生的建议
  10. 打印机添加或者设置流程
  11. unity读取Json文件
  12. Vs2019 打包项目程序和安装卸载程序
  13. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
  14. 【大咖周刊】Linus 在谷歌介绍 Git、IBM340亿收购小红帽、IDE Visual Studio 开始支持 Java 了...
  15. Google SketchUp Cookbook: (Chapter 1) Making Multiple Copies
  16. Materials - 剑网3地形材质若干
  17. 【Docker容器镜像加速器~阿里云镜像加速器】
  18. 推荐书籍:软件定义网络 SDN与OpenFlow解析
  19. 服务器运维KPI指标,IT运维包括哪些内容,考核标准是什么
  20. Macbook Pro的Type-c接口失灵了如何解决?

热门文章

  1. 逃离塔克夫TT辅助注入器再次更新0.56
  2. win10硬盘分区教程,非常简单不用安装软件
  3. kivy中文问题解决
  4. 在JS中如何去掉千分号
  5. win10切换桌面_开始菜单终变身但仍不完美!用这些利器让Win10改头换面吧
  6. 【Windows】高效的本地文件搜索工具《Everything》
  7. TP5.1使用pgsql报错“没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换”的解决办法...
  8. 智慧水位远程监测报警系统
  9. 西南交大计算机考研三本,过来人的忠告:西南交通大学机械考研的七个建议
  10. 从小白程序员一路晋升为大厂高级技术专家我看过哪些书籍?(建议收藏)