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