打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MFC中通过CURL 下载,断点续传,
1  获取 将要下载文件的大小
例如
http;

char *url = "http://softdownload.hao123.com/hao123-soft-online-bcs/soft/L/ludashisetup.zip"
如果是ftp
ftp://192.168.2.200
double downLength(const char* url){
double doubleDownLen=0;
CURL* handle=curl_easy_init();
//curl_easy_setopt(handle, CURLOPT_USERPWD,"guan:123456"); 
curl_easy_setopt(handle,CURLOPT_URL,url);
curl_easy_setopt(handle, CURLOPT_NOBODY, 1L); 
if(curl_easy_perform(handle)==CURLE_OK){
curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &doubleDownLen);
return doubleDownLen;
}
else
return 0;
}
获取下载文件的 文件名 

void getfilename(char* url, char* name){// 辅助函数,用于从URL中获取文件名
// 找到URL中的最后一个‘/’字符
char* pos = strrchr(url,'/');  //strrchr  是从字符串的最后面开始查找

if(NULL!=pos){
// 将URL中的文件名(从pos+1开始直到字符串结束)复制到name字符串中
strcpy(name, pos+1);
}     
}
-------------------------  将下载下来的  组合为一个文件


size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
int written = fwrite(ptr, size, nmemb, stream);

nowDownLength+=(size*nmemb);
// ss=GetTickCount();


if(SendFlag==1) //如果 更新 才给进度条发送消息  一般的下载就不更新

{
::SendMessage(((CTransparentDialogDlg *)AfxGetApp()->GetMainWnd())->m_hWnd,WM_SETPROGRESS,0,0);
}

return written;
}


---------------------- 获取本地文件大小, 在需要 续传的时候 要用到,在需要续传的前面,先调用这个函数

curl_off_t  localFileLength(char * strLocalFile)
{
struct stat file_info;
//if(stat("./vs2005.rar", &file_info) == 0)
//    获取本地文件的信息
if(stat(strLocalFile, &file_info) == 0)   // 获取成功
{
resume=1;
return  file_info.st_size; 
}   
else
{
//AfxMessageBox("vs 2005获取消息失败!");
resume=0;
return -1;
}
}
下载文件
CURLcode download(char* url,char* out,int resumeFlag,long localFileLen,int writeFlag=0){       // 待下载文件的URL,下载后的文件名
CURL *curl = NULL;
FILE *fp = NULL;
CURLcode res;
// 调用函数库中的curl_easy_init()函数完成初始化 
totalDownLength=downLength(url);
/*
char buf[20];
sprintf(buf,"文件总大小 %lf",totalDownLength);
AfxMessageBox(buf);
*/



curl = curl_easy_init();
if (curl)  // 判断初始化是否成功
{
// 以二进制可写方式打开文件,保存下载得到的数据
if(resumeFlag==1)
{
fp = fopen(out,"ab+");
}
else
{
fp= fopen(out,"wb");

}
// 根据libcurl的使用方法,设定下载的URL、写入函数以及写入的文件
//curl_easy_setopt(curl, CURLOPT_USERPWD,"guan:123456");
//::Sleep(1000);
curl_easy_setopt(curl, CURLOPT_URL, url);

if(writeFlag==0)
{
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
}
else
{
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_dataDL);
}

// curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, ); 
//设置http 头部处理函数
     //  curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, resumeFlag?localfilelen:0);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
// 调用curl_easy_perform()函数执行下载操作
res = curl_easy_perform(curl);
// 下载完成,进行最后的清理工作
curl_easy_cleanup(curl);
// 关闭文件 
fclose(fp);
return res;
}
else{
// 如果初始化失败,返回相应的错误代码
return CURLE_FAILED_INIT;
}



---------------一个实例
void CTransparentDialogDlg::OnBnClickedBtnstart()
{

char buf[20]={"./vs2005.rar"};
localfilelen=localFileLength(buf);
/*
CString str;
str.Format("本地文件大小 %d",localfilelen);
MessageBox(str);
*/
SendFlag=1;  //  要更新进度条
AfxBeginThread(DownThread,NULL);

}


UINT DownThread(LPVOID p){
char *url =(LPSTR)(LPCTSTR)strDownUrl;
//char *url = "http://softdownload.hao123.com/hao123-soft-online-bcs/soft/L/ludashisetup.zip";
char name[100] = "";
getfilename(url,name);
// 调用函数库所提供函数实现的download()函数,
// 完成文件的下载

CURLcode res = download(url,name,resume,localfilelen);
// 根据返回结果,提示用户下载成功与否
if(CURLE_OK == res)
{
char buf[20]={0};
ifstream iss("./versionnew.txt");
iss>>buf;

ofstream oss("./version.txt");// 没有就创建  Version.txt
if(oss)
{
oss<<buf;
}
else
{
AfxMessageBox("写入当前版本失败!");
//return ;
}
CTransparentDialogDlg * dlg;
dlg=(CTransparentDialogDlg *) (AfxGetApp()->GetMainWnd());

DeleteFile("./versionnew.txt");


// Sleep(1000);


}
else{

AfxMessageBox(_T("下载失败"));
}
return 0;
}




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
libcurl应用:如何把下载内容写入内存
linux使用libcurl实现put访问服务器
cURL函数库错误码说明之PHP curl_errno函数 | 一聚教程网
libcurl库介绍
Post XML file through Http And GetRes
对CURL的一些研究 - ChinaUnix.net
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服