您的位置:首页 > 移动开发 > Cocos引擎

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

2016-02-29 10:06 363 查看
以下代码实现了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, 0, 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, 0, 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: