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