加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cocos2.2.3在线下载——断点续传

发布时间:2020-12-14 16:55:21 所属栏目:百科 来源:网络整理
导读:以下代码实现了Cocos的在线下载中的断点续传,可跨平台使用#include fstream#include iostream#include curl/curl.hlong DLManager::downloadResume(){//判断该要下载的文件是否存在//http://blog.csdn.net/roger_77/article/details/1538447/fstream _file;
以下代码实现了Cocos的在线下载中的断点续传,可跨平台使用

#include <fstream>
#include <iostream>
#include <curl/curl.h>

long DLManager::downloadResume()
{
	//判断该要下载的文件是否存在
	//http://blog.csdn.net/roger_77/article/details/1538447/
	fstream _file;
	_file.open(getTargetPath().c_str(),ios::in);
	if(_file)
	{
		CCLog("%s is Exist",getTargetPath().c_str());
	}
	else
	{		
		CCLog("%s is not Exist",getTargetPath().c_str());
		return -1;
	}
	_file.close();

	//获取已下载文件的大小
	long fileSize = 0;
	FILE * fp = fopen(getTargetPath().c_str(),"rb");
	if (!fp)
	{
		return -1;
	}
	fseek(fp,SEEK_END); // 移到文件末尾
	fileSize = ftell(fp);
	CCLog("getTargetPath().c_str() : size = %dn",fileSize);
	fclose(fp);

	return fileSize;
}

bool DLManager::download()
{
	//断点续传获取续传文件的大小
	_curPackageSize = downloadResume();
	
	//打开文件,将文件指针移到末尾
	FILE *fp = fopen(getTargetPath().c_str(),"a+b");		
	if (! fp)
	{		
		CCLog("can not create file %s",getTargetPath().c_str());
		return false;
	}
	fseek(fp,SEEK_END);
	
	//下载文件
	CURL *_curl;
	_curl = curl_easy_init();
	if (! _curl)
	{
		CCLog("can not init curl");
		return false;
	}		
	
	// 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,DLManagerProgressFunc);
	curl_easy_setopt(_curl,CURLOPT_PROGRESSDATA,this);
	
	if(_curPackageSize != -1)
	{//若存在断点续传的文件,则设置下的起始位置,即已下载的包的大小
		curl_easy_setopt(_curl,CURLOPT_RESUME_FROM,_curPackageSize);
	}
	
	res = curl_easy_perform(_curl);
	curl_easy_cleanup(_curl);
	if (res != 0)
	{		
		CCLog("error when download package");
		fclose(fp);
		return false;
	}
	
	CCLog("succeed downloading package %s",_packageUrl.c_str());
	fclose(fp);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读