curl断点续载
摘自http://blog.csdn.net/zmy12007/article/details/37157297
摘自http://www.linuxidc.com/Linux/2014-10/107509.htm
curl断点续传,下载过程中关闭控制台,然后重新启动,又会接着下载
- #include "stdafx.h"
- #include <io.h>
- #include "curl/curl.h"
- #include <string>/*注意包含这个头文件后必须把share.h重命名一下,可能是stl里面也有这个头文件,比如curl_share.h,然后把包含到的地方替换一下*/
- #include "curl/easy.h"
- using namespace std;
- static size_t downLoadPackage(void *ptr, size_t size, size_t nmemb, void *userdata)
- {
- FILE *fp = (FILE*)userdata;
- size_t written = fwrite(ptr, size, nmemb, fp);
- return written;
- }
- int assetsManagerProgressFunc(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded)
- {
- static int percent = 0;
- int tmp = 0;
- long localLen = *(long*)ptr;
- if ( totalToDownload > 0 )
- {
- tmp = (int)((nowDownloaded + (double)localLen) / (totalToDownload + (double)localLen) * 100);
- }
- printf("下载进度%0d%%\r", tmp);
- return 0;
- }
- long GetLocalFileLenth(const char* fileName)
- {
- char strTemp[256] = {0};
- strcpy_s(strTemp,fileName);
- FILE* fp = fopen(strTemp, "rb");
- if(fp != NULL)
- {
- long localLen = _filelength(_fileno(fp));
- fclose(fp);
- return localLen;
- }
- return 0;
- }
- /************************************************************************/
- /* 获取要下载的远程文件的大小 */
- /************************************************************************/
- long getDownloadFileLenth(const char *url){
- long downloadFileLenth = 0;
- CURL *handle = curl_easy_init();
- curl_easy_setopt(handle, CURLOPT_URL, url);
- curl_easy_setopt(handle, CURLOPT_HEADER, 1); //只需要header头
- curl_easy_setopt(handle, CURLOPT_NOBODY, 1); //不需要body
- if (curl_easy_perform(handle) == CURLE_OK)
- {
- curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &downloadFileLenth);
- }
- else
- {
- downloadFileLenth = -1;
- }
- return downloadFileLenth;
- }
- bool downLoad(void *_curl, std::string _packageUrl, std::string _storagePath, std::string fileName )
- {
- // Create a file to save package.
- const string outFileName = _storagePath + fileName;
- //================断点续载===================
- long localLen = GetLocalFileLenth(outFileName.c_str());
- FILE *fp = fopen(outFileName.c_str(), "a+b");
- if (! fp)
- {
- return false;
- }
- fseek(fp, 0, SEEK_END);
- // Download pacakge
- CURLcode res;
- curl_easy_setopt(_curl, CURLOPT_URL, _packageUrl.c_str());
- curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, downLoadPackage);
- curl_easy_setopt(_curl, CURLOPT_WRITEDATA, fp);
- curl_easy_setopt(_curl, CURLOPT_NOPROGRESS, false);
- curl_easy_setopt(_curl, CURLOPT_PROGRESSFUNCTION, assetsManagerProgressFunc);
- curl_easy_setopt(_curl, CURLOPT_NOSIGNAL, 1L);
- curl_easy_setopt(_curl, CURLOPT_LOW_SPEED_LIMIT, 1L);
- curl_easy_setopt(_curl, CURLOPT_LOW_SPEED_TIME, 5L);
- curl_easy_setopt(_curl, CURLOPT_HEADER, 0L);
- curl_easy_setopt(_curl, CURLOPT_NOBODY, 0L);
- curl_easy_setopt(_curl, CURLOPT_FOLLOWLOCATION, 1L);
- curl_easy_setopt(_curl, CURLOPT_RESUME_FROM, localLen);
- curl_easy_setopt(_curl, CURLOPT_PROGRESSDATA, &localLen);
- res = curl_easy_perform(_curl);
- curl_easy_cleanup(_curl);
- if (res != 0)
- {
- fclose(fp);
- return false;
- }
- fclose(fp);
- return true;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- CURL* _curl = curl_easy_init();
- if (! _curl)
- {
- return 0;
- }
- 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");
- //downLoad(_curl, "http://localhost/MyWebServer.rar", "./", "MyWebServer.rar");
- getchar();
- return 0;
- }
curl断点续载的更多相关文章
- scrapy爬虫之断点续爬和多个spider同时爬取
from scrapy.commands import ScrapyCommand from scrapy.utils.project import get_project_settings #断点续 ...
- 关于视频断点续播和H5的本地存储
前段时间,需要在下实现一个视频的断点续播功能,呃,我不会呀,这就很尴尬了.然后呢,在下就想起了一个叫做localStorage的东西.这是个什么东西呢?在网上查阅了一些资料后,在下发现这是webSto ...
- python3.6 单文件爬虫 断点续存 普通版 文件续存方式
# 导入必备的包 # 本文爬取的是顶点小说中的完美世界为列.文中的aa.text,bb.text为自己创建的text文件 import requests from bs4 import Beautif ...
- Electron 的断点续下载
最近用 Electron 做了个壁纸程序,需要断点续下载,在这里记录一下. HTTP断点下载相关的报文 Accept-Ranges 告诉客户端服务器是否支持断点续传,服务器返回 Content-Ran ...
- 解决win7 下 curl无法加载的问题
最近分别在WIN7和Windows8 上分别安装php 高版本!都遇到了这个问题! 一.win7系统64位, apache2.2, php 5.35 vc6 版本 这个比较容易: 1. phpinfo ...
- Keras模型训练的断点续训、早停、效果可视化
训练:model.fit()函数 fit(x=None, y=None, batch_size=None, epochs=, verbose=, callbacks=None, validation_ ...
- HTML 5 断点续上传
断点上传,java里面比较靠谱一点的,一般都会选用Flex.我承认,Flex只是摸了一下,不精通.HTML 5 有个Blob对象(File对象继承它),这个对象有个方法slice方法,可以对一个文件进 ...
- scrapy 断点续爬
第一步:安装berkeleydb数据库 第二部:pip install bsddb3 第三部:pip install scrapy-deltafetch 第四部: settings.py设置 SPID ...
- python下载mp4 同步和异步下载支持断点续下
Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Range:(unit=first byte pos)-[last byte pos] Range 头部的格式有以下几种 ...
随机推荐
- UESTC_秋实大哥去打工 2015 UESTC Training for Data Structures<Problem G>
G - 秋实大哥去打工 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- 51操作各种demo 驱动
24C02 bit write=0; //写24C02的标志: sbit sda=P2^0; sbit scl=P2^1; void delay0() { ;; } void start() //开始 ...
- poj 2411 新写法
别以为我在刷水题.... 今天做了场srm,500pt想到了是dp但是无从下手,但是看了rng_58的神代码后顿觉海阔天空啊(盯着看了一个下午),相比于一年前的写法,真的是不忍直视啊, TC真是个好地 ...
- PHP Database ODBC 之 ODBC
ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库). 创建 ODBC ...
- linux内存操作----kernel 3.5.X copy_from_user()和copy_to_user()
前面的一篇文章中简单的描写叙述了一下内存映射的内容,http://blog.csdn.net/codectq/article/details/25658813,这篇文章作为用户把内存规划好之后,在用户 ...
- Java中基础类库使用
Java中基础类库: 在这里我仅仅介绍几种我个人觉得会常常使用的 1:Object类中的Clone机制仅仅是对对象进行浅层次的克隆,假设须要进行深层次的克隆的话那么就要自己写(详细Clone方法请參考 ...
- yum 安装软件提示错误
试用yum命令装软件时,遇到了下面的问题,错误提示: rpmdb: unable to join the environment error: db4 error(11) from dbenv-> ...
- Echarts动态数据显示
自己慢慢摸索出来的,留着以后可能会用到 一.先引入jquery,再引入echarts.js 二.配置容器 三.配置路径和数据选项等 <script type="text/javascr ...
- 用MVC4+EF改写XXX系统的计划--前言
感觉自己工作了三年,重来没有自己一个人写一个项目,从开始的策划,功能需求,业务逻辑,扩展,性能优化等等方面去做,从今天起准备发比半年时间重写XXX项目,每天中午和晚上分别花半个小时和一个小时开发,周末 ...
- Javascript进阶篇——(函数)笔记整理
这节是根据慕课网和JavaScript DOM编程艺术一书加起来做的笔记 什么是函数如果需要多次使用同一段代码,可以把它们封装成一个函数.函数(function)就是一组允许在你的代码里随时调用的语句 ...