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

以下代码实现了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 = %d\n",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);
}

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...