摘自http://blog.csdn.net/zmy12007/article/details/37157297

摘自http://www.linuxidc.com/Linux/2014-10/107509.htm

curl断点续传,下载过程中关闭控制台,然后重新启动,又会接着下载

  1. #include "stdafx.h"
  2. #include <io.h>
  3. #include "curl/curl.h"
  4. #include <string>/*注意包含这个头文件后必须把share.h重命名一下,可能是stl里面也有这个头文件,比如curl_share.h,然后把包含到的地方替换一下*/
  5. #include "curl/easy.h"
  6. using namespace std;
  7. static size_t downLoadPackage(void *ptr, size_t size, size_t nmemb, void *userdata)
  8. {
  9. FILE *fp = (FILE*)userdata;
  10. size_t written = fwrite(ptr, size, nmemb, fp);
  11. return written;
  12. }
  13. int assetsManagerProgressFunc(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded)
  14. {
  15. static int percent = 0;
  16. int tmp = 0;
  17. long localLen = *(long*)ptr;
  18. if ( totalToDownload > 0 )
  19. {
  20. tmp = (int)((nowDownloaded + (double)localLen) / (totalToDownload + (double)localLen) * 100);
  21. }
  22. printf("下载进度%0d%%\r", tmp);
  23. return 0;
  24. }
  25. long GetLocalFileLenth(const char* fileName)
  26. {
  27. char strTemp[256] = {0};
  28. strcpy_s(strTemp,fileName);
  29. FILE* fp = fopen(strTemp, "rb");
  30. if(fp != NULL)
  31. {
  32. long localLen = _filelength(_fileno(fp));
  33. fclose(fp);
  34. return localLen;
  35. }
  36. return 0;
  37. }
  38. /************************************************************************/
  39. /* 获取要下载的远程文件的大小                                            */
  40. /************************************************************************/
  41. long getDownloadFileLenth(const char *url){
  42. long downloadFileLenth = 0;
  43. CURL *handle = curl_easy_init();
  44. curl_easy_setopt(handle, CURLOPT_URL, url);
  45. curl_easy_setopt(handle, CURLOPT_HEADER, 1);    //只需要header头
  46. curl_easy_setopt(handle, CURLOPT_NOBODY, 1);    //不需要body
  47. if (curl_easy_perform(handle) == CURLE_OK)
  48. {
  49. curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &downloadFileLenth);
  50. }
  51. else
  52. {
  53. downloadFileLenth = -1;
  54. }
  55. return downloadFileLenth;
  56. }
  57. bool downLoad(void *_curl, std::string _packageUrl, std::string _storagePath, std::string fileName )
  58. {
  59. // Create a file to save package.
  60. const string outFileName = _storagePath + fileName;
  61. //================断点续载===================
  62. long localLen = GetLocalFileLenth(outFileName.c_str());
  63. FILE *fp = fopen(outFileName.c_str(), "a+b");
  64. if (! fp)
  65. {
  66. return false;
  67. }
  68. fseek(fp, 0, SEEK_END);
  69. // Download pacakge
  70. CURLcode res;
  71. curl_easy_setopt(_curl, CURLOPT_URL, _packageUrl.c_str());
  72. curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, downLoadPackage);
  73. curl_easy_setopt(_curl, CURLOPT_WRITEDATA, fp);
  74. curl_easy_setopt(_curl, CURLOPT_NOPROGRESS, false);
  75. curl_easy_setopt(_curl, CURLOPT_PROGRESSFUNCTION, assetsManagerProgressFunc);
  76. curl_easy_setopt(_curl, CURLOPT_NOSIGNAL, 1L);
  77. curl_easy_setopt(_curl, CURLOPT_LOW_SPEED_LIMIT, 1L);
  78. curl_easy_setopt(_curl, CURLOPT_LOW_SPEED_TIME, 5L);
  79. curl_easy_setopt(_curl, CURLOPT_HEADER, 0L);
  80. curl_easy_setopt(_curl, CURLOPT_NOBODY, 0L);
  81. curl_easy_setopt(_curl, CURLOPT_FOLLOWLOCATION, 1L);
  82. curl_easy_setopt(_curl, CURLOPT_RESUME_FROM, localLen);
  83. curl_easy_setopt(_curl, CURLOPT_PROGRESSDATA, &localLen);
  84. res = curl_easy_perform(_curl);
  85. curl_easy_cleanup(_curl);
  86. if (res != 0)
  87. {
  88. fclose(fp);
  89. return false;
  90. }
  91. fclose(fp);
  92. return true;
  93. }
  94. int _tmain(int argc, _TCHAR* argv[])
  95. {
  96. CURL* _curl = curl_easy_init();
  97. if (! _curl)
  98. {
  99. return 0;
  100. }
  101. downLoad(_curl, "http://ardownload.adobe.com/pub/adobe/reader/win/11.x/11.0.01/en_US/AdbeRdr11001_en_US.exe", "./", "AdbeRdr11001_en_US.exe");
  102. //downLoad(_curl, "http://localhost/MyWebServer.rar", "./", "MyWebServer.rar");
  103. getchar();
  104. return 0;
  105. }

curl断点续载的更多相关文章

  1. scrapy爬虫之断点续爬和多个spider同时爬取

    from scrapy.commands import ScrapyCommand from scrapy.utils.project import get_project_settings #断点续 ...

  2. 关于视频断点续播和H5的本地存储

    前段时间,需要在下实现一个视频的断点续播功能,呃,我不会呀,这就很尴尬了.然后呢,在下就想起了一个叫做localStorage的东西.这是个什么东西呢?在网上查阅了一些资料后,在下发现这是webSto ...

  3. python3.6 单文件爬虫 断点续存 普通版 文件续存方式

    # 导入必备的包 # 本文爬取的是顶点小说中的完美世界为列.文中的aa.text,bb.text为自己创建的text文件 import requests from bs4 import Beautif ...

  4. Electron 的断点续下载

    最近用 Electron 做了个壁纸程序,需要断点续下载,在这里记录一下. HTTP断点下载相关的报文 Accept-Ranges 告诉客户端服务器是否支持断点续传,服务器返回 Content-Ran ...

  5. 解决win7 下 curl无法加载的问题

    最近分别在WIN7和Windows8 上分别安装php 高版本!都遇到了这个问题! 一.win7系统64位, apache2.2, php 5.35 vc6 版本 这个比较容易: 1. phpinfo ...

  6. Keras模型训练的断点续训、早停、效果可视化

    训练:model.fit()函数 fit(x=None, y=None, batch_size=None, epochs=, verbose=, callbacks=None, validation_ ...

  7. HTML 5 断点续上传

    断点上传,java里面比较靠谱一点的,一般都会选用Flex.我承认,Flex只是摸了一下,不精通.HTML 5 有个Blob对象(File对象继承它),这个对象有个方法slice方法,可以对一个文件进 ...

  8. scrapy 断点续爬

    第一步:安装berkeleydb数据库 第二部:pip install bsddb3 第三部:pip install scrapy-deltafetch 第四部: settings.py设置 SPID ...

  9. python下载mp4 同步和异步下载支持断点续下

    Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Range:(unit=first byte pos)-[last byte pos] Range 头部的格式有以下几种 ...

随机推荐

  1. 算法(Algorithm)是什么?

    我们用煎蛋来打个比方.煎蛋的一般步骤是: 1.>取煎锅. 2.>取油. ->我们有油吗? ****有,把油倒入煎锅. ****没有,我们要去买油吗? #########要买,出去买油 ...

  2. kindeditor在sae上传文件修改,适合php

    kindeditor在sae上传文件修改,适合php 当前位置: 首页  > 论坛  > 经验共享 用户登录   新用户注册   主题: kindeditor在sae上传文件修改,适合ph ...

  3. PHP 表单处理

    PHP 超全局变量 $_GET 和 $_POST 用于收集表单数据(form-data). PHP - 一个简单的 HTML 表单 下面的例子显示了一个简单的 HTML 表单,它包含两个输入字段和一个 ...

  4. 实现action的三种方法

    1.一个普通的类 public class testAction1 { public String execute(){ return "success"; } } 2.实现Act ...

  5. Ice_cream's world I

    Ice_cream's world I Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  6. hdu 3954 Level up(线段树)

    题目链接:hdu 3954 Level up 题目大意:N个英雄,M个等级,初始等级为1,给定每一个等级须要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每一个人杀了x个怪物:Q ...

  7. hive大数据倾斜总结

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的 Counters是整个Job的总和,优化是基于这些Counters得出的 ...

  8. 正式软件工作第一天————MVC、ext JS、和clsa

    正式上班第一天,引导人就提出了MVC.extjs和clsa 三种框架,在这之前只听说了MVC,但还木有学习过,顺便把学习过程记录下来. MVC——初学习 1.M——model 模型:应用对象,处理业务 ...

  9. HTML中IE条件注释判断语句(<!--[if XX IE X]><![endif]-->)

    <!--[if XX IE X]><![endif]-->是IE专门提供的一种语法,其他浏览器会将其作为注释而忽略这些语句.   作用: 根据不同的IE版本加载对应的CSS或者 ...

  10. hdu2206IP的计算

    Problem Description 在网络课程上,我学到了很多有关IP的知识.IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方 ...