curl断点续载

2023-05-16

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;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

curl断点续载 的相关文章

随机推荐

  • Mysql 批量修改四种方式效率对比(一)

    文章目录 Mysql 批量修改四种方式效率对比环境信息测试数据pom 依赖数据库初始化测试数据 批量修改方案第一种 for第二种 case when第三种 replace into第四种 ON DUPLICATE KEY UPDATE 测试
  • idea插件-SonarLint(六)

    文章目录 功能插件名称效果 功能 检查代码bug xff0c 排除编码集错误 插件名称 SonarLint 效果 以下只是演示可以进行bug提示及优化 xff0c 还有更多 修复意见 xff1a 使用 logger 替代 System ou
  • idea插件安装方式(七)

    插件安装两种方式 在线安装 通过 Preferences gt Plugins gt marketplace 在线安装 离线安装 通过 https plugins jetbrains com 离线安装 比如 Lombok xff0c 找对应
  • mysql-递归查询(二)

    文章目录 情景描述数据准备递归sql 情景描述 mysql 表查询 xff0c 经常有通过子不断查询父 xff0c 直至查询不到为止 数据准备 SET NAMES utf8 span class token punctuation span
  • zabbix重启命令

    1 zabbix server服务重启 service zabbix server restart 或者 service zabbix server restart 2 zabbix agentd客户端重启 service zabbix a
  • 使用MediaPlayer实现播放、暂停、继续和停止功能的简易音乐播放器

    1 布局文件 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 http schemas android c
  • H3C交换机web管理配置

    1 下载一个超级终端到PC机上 由于工作环境不能联网的环境下 xff0c 下载了好几个超级终端才能用 2 超级终端连接有很多教程 但是有一个重要的事情 xff1a 在COM1属性的端口设置里面 xff0c 将 xff08 位 B xff09
  • 交换机MIB浏览器ifType、ifDescr、ifMtu、ifInOctets等的含义

    1 ifType 接口的类型 取值117表示接口为GigabitEthernet 取值62表示借口为FastEnthernet 2 ifDescr 接口类型的描述 有GigabitEthernet FastEthernet等 3 ifMtu
  • mac下PyCharm导入第三方包

    最近对python有兴趣 xff0c 在网上搜了 八天深入理解python 视频教程 xff0c 由于用的mac xff0c 不用安装python xff0c 感觉瞬间开发环境就已经具备了 xff0c 然后连个ipython都没装上 xff
  • Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-

    Failed to execute goal org mybatis generator mybatis generator maven plugin 1 3 2 generate default cli on project ssm Ex
  • windows系统下QT打包后到不同系统的各种报错问题分析

    最近碰到好多人问关于WINDOWS上的QT打包后在自己电脑上可以运行 xff0c 换台电脑报各种错误的问题 于是特地写个帖子总结下一些问题 xff1a 首先是打包QT xff0c 将QT的系统库拉出来 这里可以借用windeployqt工具
  • python使用requests提交post请求并上传文件(multipart/form-data)

    目录 一 背景 二 请求接口上传文件 2 1 分析接口 2 2 python进行请求 三 总结 一 背景 也是前几天 xff0c 有一个需求上传文件需要自动化 具体是上传到系统一个文件 xff0c 并收到返回结果 考虑使用python的re
  • Optitrack光学动作捕捉

    光学式动作捕捉依靠一整套精密而复杂的光学摄像头来实现 xff0c 它通过计算机视觉原理 xff0c 由多个高速摄像机从不同角度对目标特征点进行跟踪来完成全身的动作的捕捉 美国大片中的后期特效制作大都是用的这种光学式动捕技术打开百度APP x
  • 带参数的宏的问题

    include 34 iostream 34 using namespace std define COMPUTE XX a a a 43 a 2 int main int a 61 2 int test1 61 COMPUTE XX 43
  • Qt TCP/UDP通讯封装

    Qt TCP UDP通讯封装 TCP客户端 class TcpClient public QTcpSocket Q OBJECT public explicit TcpClient QObject parent 61 nullptr Tcp
  • http post请求

    1 引入所需要的jar包 lt dependency gt lt groupId gt org apache httpcomponents lt groupId gt lt artifactId gt httpclient lt artif
  • C语言截取从某位置开始指定长度子字符串方法

    C语言中没有从某位置开始指定长度子字符串的函数 xff08 还是我没找到 xff1f xff09 xff0c 只有从头开始截取的strncat和strncpy xff0c 以strncpy为例 xff1a char dest 4 61 34
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • HP-SOCKET学习笔记(一)

    介绍 HP Socket是一套通用的高性能TCP UDP HTTP 通信框架 xff0c 包含服务端组件 客户端组件和Agent组件 xff0c 广泛适用于各种不同应用场景的TCP UDP HTTP通信系统 xff0c 提供C C 43 4
  • curl断点续载

    curl断点续传 xff0c 下载过程中关闭控制台 xff0c 然后重新启动 xff0c 又会接着下载 include 34 stdafx h 34 include lt io h gt include 34 curl curl h 34