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){// 輔助函數(shù),用于從URL中獲取文件名
// 找到URL中的最后一個‘/’字符
char* pos = strrchr(url,'/'); //strrchr 是從字符串的最后面開始查找
if(NULL!=pos){
// 將URL中的文件名(從pos+1開始直到字符串結(jié)束)復制到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) //如果 更新 才給進度條發(fā)送消息 一般的下載就不更新
{
::SendMessage(((CTransparentDialogDlg *)AfxGetApp()->GetMainWnd())->m_hWnd,WM_SETPROGRESS,0,0);
}
return written;
}
---------------------- 獲取本地文件大小, 在需要 續(xù)傳的時候 要用到,在需要續(xù)傳的前面,先調(diào)用這個函數(shù)
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;
// 調(diào)用函數(shù)庫中的curl_easy_init()函數(shù)完成初始化
totalDownLength=downLength(url);
/*
char buf[20];
sprintf(buf,"文件總大小 %lf",totalDownLength);
AfxMessageBox(buf);
*/
curl = curl_easy_init();
if (curl) // 判斷初始化是否成功
{
// 以二進制可寫方式打開文件,保存下載得到的數(shù)據(jù)
if(resumeFlag==1)
{
fp = fopen(out,"ab+");
}
else
{
fp= fopen(out,"wb");
}
// 根據(jù)libcurl的使用方法,設定下載的URL、寫入函數(shù)以及寫入的文件
//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 頭部處理函數(shù)
// 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);
// 調(diào)用curl_easy_perform()函數(shù)執(zhí)行下載操作
res = curl_easy_perform(curl);
// 下載完成,進行最后的清理工作
curl_easy_cleanup(curl);
// 關(guān)閉文件
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);
// 調(diào)用函數(shù)庫所提供函數(shù)實現(xiàn)的download()函數(shù),
// 完成文件的下載
CURLcode res = download(url,name,resume,localfilelen);
// 根據(jù)返回結(jié)果,提示用戶下載成功與否
if(CURLE_OK == res)
{
char buf[20]={0};
ifstream iss("./versionnew.txt");
iss>>buf;
ofstream oss("./version.txt");// 沒有就創(chuàng)建 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;
}