[libcurl]_[0基础]_[使用libcurl下载大文件]
场景:
1. 在Windows编程时, 下载http页面(html,xml)能够使用winhttp库,可是并非非常下载文件,由于会失败. 由此引出了WinINet库,无奈这个库的稳定性比較低,使用样例又少,
下载大文件时常常是不完整,可查找的资料非常少或者是没有特殊情况的解决的方法。
2. 我的原则是假设系统有自带的就用系统的,可是 WinINet 要掌握须要花不少时间. 时间因素考虑到了libcurl.
3. libcurl支持ftp,http等协议的文件读取,还能自己主动获取文件大小, 最重要的是不须要怎么改动就能稳定支持完整下载大文件,还能支持跨平台(Windows,MacOSX)。
參考编译后的curl.exe使用:
curl.exe -O http://img.ptcms.csdn.net/article/201506/25/558bbe1baed6e.jpg
之前也有写libcurl的使用的其它场景:
[libcurl]_[C/C++]_[使用libcurl库做简单软件更新解决方式]
编译mingw库非常容易,直接依赖windows本地库即可,要编译msvc版本号的话须要进入 winbuild 文件夹,參考 BUILD.WINDOWS.txt 里的
nmake /f Makefile.vc mode=<static or dll> <options>
我用的配置
nmake /f Makefile.vc mode=dll VC=10 ENABLE_IDN=no
http_download_domain.h
#ifndef __HTTP_DOWNLOAD_DOMAIN
#define __HTTP_DOWNLOAD_DOMAIN #include <string>
#include "curl/curl.h" class HttpDownloadDomain
{
public:
HttpDownloadDomain(bool* cancel);
~HttpDownloadDomain();
bool DownloadFile(std::string url,std::wstring path);
bool *cancel_; private: static size_t DownloadCallback(void* pBuffer, size_t nSize, size_t nMemByte, void* pParam);
static int ProgressCallback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow); }; #endif
http_download_domain.cpp
#include "stdafx.h" #include "http_download_domain.h" #include <iostream> HttpDownloadDomain::HttpDownloadDomain(bool* cancel)
{
cancel_ = cancel;
} HttpDownloadDomain::~HttpDownloadDomain()
{
} size_t HttpDownloadDomain::DownloadCallback(void* pBuffer, size_t nSize, size_t nMemByte, void* pParam)
{
FILE* fp = (FILE*)pParam;
size_t nWrite = fwrite(pBuffer, nSize, nMemByte, fp); return nWrite;
} int HttpDownloadDomain::ProgressCallback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
HttpDownloadDomain* dd = (HttpDownloadDomain*)clientp; if ( dltotal > -0.1 && dltotal < 0.1 )
{
return 0;
}
int nPos = (int) ( (dlnow/dltotal)*100 );
//通知进度条更新下载进度
std::cout << "dltotal: " << (long)dltotal << " ---- dlnow:" << (long)dlnow << std::endl; if(*dd->cancel_)
{
//1. 返回非0值就会终止 curl_easy_perform 运行
return -2;
}
return 0;
} bool HttpDownloadDomain::DownloadFile(std::string URLADDR,std::wstring path)
{
//初始化curl,这个是必须的
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, URLADDR.c_str()); //设置接收数据的回调
FILE* file = _wfopen(path.c_str(), L"wb");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, DownloadCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA,file);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, ProgressCallback);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,this);
CURLcode retcCode = curl_easy_perform(curl); const char* pError = curl_easy_strerror(retcCode);
std::cout << "pError: " << pError << std::endl;
fclose(file);
//清理curl,和前面的初始化匹配
curl_easy_cleanup(curl); return !retcCode;
}
使用方式:
#include "stdafx.h" #include "http_download_domain.h" int _tmain(int argc, _TCHAR* argv[])
{
bool i = 0;
HttpDownloadDomain hdd(&i);
hdd.DownloadFile("http://img.ptcms.csdn.net/article/201506/25/558bbe1baed6e.jpg",L"C:\\Users\\apple\\Downloads\\558bbe1baed6e.jpg");
system("pause");
return 0;
}
下载完整样例:
[libcurl]_[0基础]_[使用libcurl下载大文件]的更多相关文章
- [Zlib]_[0基础]_[使用zlib库压缩文件]
场景: 1. WIndows上没找到系统提供的win32 api来生成zip压缩文件, 有知道的大牛麻烦留个言. 2. zlib比較经常使用,编译也方便,使用它来做压缩吧. MacOSX平台默认支持z ...
- [网络]_[0基础]_[使用putty备份远程数据]
场景: 1. putty是windows上訪问linux服务的免费client之中的一个.用它来ssh到远程server备份数据是常见的做法(在没做好自己主动备份机制前), 通过putty界面尽管也不 ...
- [wxWidgets]_[0基础]_[经常更新进度条程序]
场景: 1. 非常根据程序的进展需要处理业务,以更新进度条,进度条的目的是为了让用户知道业务流程的进度.一个进度条程序更友好,让用户知道在程序执行.不是没有反应. 2. 现在更新见过这两种方法的进展. ...
- [zlib]_[0基础]_[使用Zlib完整解压zip内容]
场景: 1. 解压文件一般用在下载了一个zip文件之后解压,或者分析某个文件须要解压的操作上. 2. 解压文件,特别是解压带目录的zip文件往往系统没有提供这类Win32 API,当然C#自带库能解压 ...
- [C/C++标准库]_[0基础]_[使用fstream合并文本文件]
场景: 1. 就是合并文本文件,而且从第2个文件起不要合并第一行. 2. 多加了一个功能,就是支持2个以上的文件合并. 3. 问题: http://ask.csdn.net/questions/192 ...
- [ATL/WTL]_[0基础]_[CBitmap复制图片-截取图片-平铺图片]
场景: 1.当你须要截取图片部分区域作为某个控件的背景. 2.须要平铺图片到一个大区域让他自己主动放大时. 3.或者须要合并图片时. 代码: CDC sdc; CDC ddc; sdc.CreateC ...
- [C/C++标准库]_[0基础]_[交集和补集]
场景: 1. 计算std::vector A和 std::vector B里的同样的元素, 用于保留不删除. 2. 计算std::vector A和 std::vector B里各自的补集, 用于删除 ...
- [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]
std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就须要优先级越高的先运行.而queue并没有排序功能,这时priority_ ...
- [wxWidgets]_[0基础]_[不常见但有用的类wxStandardPaths]
场景: 1.wxStandardPaths 用来获取各种系统路径.能够用于存放app的配置数据.比方文档文件夹,appData等. 代码: #include "wx/wxprec.h&q ...
随机推荐
- 洛谷——P1640 [SCOI2010]连续攻击游戏
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
- 9. InnoDB通用表空间
9. InnoDB通用表空间 通用表空间是InnoDB 使用CREATE TABLESPACE语法创建的共享表空间.本节中的以下主题描述了常规表空间功能和功能: 通用表空间功能 创建通用表空间 将表添 ...
- (1) LVS基本概念和三种模式
网站架构中,负载均衡技术是实现网站架构伸缩性的主要手段之一. 所谓"伸缩性",是指可以不断向集群中添加新的服务器来提升性能.缓解不断增加的并发用户访问压力.通俗地讲,就是一头牛拉不 ...
- db2快速删除大表数据(亲测可用)
一.推荐.删了不可恢复 TRUNCATE TABLE table_name IMMEDIATE 二. DB2 LOAD FROM d:\DB2_BAK\null.del of del REPLACE ...
- 第二讲:vcs debugging basics
要求: 1.describe three methods of debugging verilog code using vcs 2.invoke ucli debugger(不重要) 3.debug ...
- day22 01 初识面向对象----简单的人狗大战小游戏
day22 01 初识面向对象----简单的人狗大战小游戏 假设有一个简单的小游戏:人狗大战 怎样用代码去实现呢? 首先得有任何狗这两个角色,并且每个角色都有他们自己的一些属性,比如任务名字nam ...
- python_面向对象笔记
继承 什么是继承? 继承是一种新建类的方式,新建的类称为子类或派生类父类又称为基类.超类 子类可以“遗传”父类的属性,从而可以减少代码冗余 如何寻找继承关系?先抽象,再继承,继承描述的就是一种父子关系 ...
- 【HIHOCODER 1469 】福字(DP)
描述 新年到了,你收到了一副画.你想找到里面最大的福字. 一副画是一个n × n的矩阵,其中每个位置都是一个非负整数. 一个福字被定义成是大小为 k 的正方形,满足其中的每个位置上的数都恰好比他的左边 ...
- POJ 1201 Intervals(差分约束 区间约束模版)
关于差分约束详情可阅读:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 题意: 给定n个区间[L,R], 每个区间至 ...
- 大数据学习——hadoop安装
上传centOS6.7-hadoop-2.6.4.tar.gz 解压 tar -zxvf centOS6.7-hadoop-2.6.4.tar.gz hadoop相关修改配置 1 修改 /root/a ...