VC++下载文件线程 有进度条 百分比

来源:互联网 发布:grub没有windows 编辑:程序博客网 时间:2024/06/06 09:03

UINT DownloadFile(LPVOID pParam){CWnd*pwnd = AfxGetMainWnd();CProgressCtrl*m_Prog = (CProgressCtrl*)pwnd->GetDlgItem(IDC_PROGRESS1);CButton*bStart = (CButton*)pwnd->GetDlgItem(IDB_BTN_START);charfilebuf[512];CInternetSessionnetSession;CStdioFile*fTargFile;intoutfs;CStringszFile,FileSize,KBin,KBsec,NewName,Perc;try{pwnd->GetDlgItemText(IDC_EDIT1,szFile);pwnd->SetDlgItemText(IDC_STAT,"正在校验下载地址...");fTargFile = netSession.OpenURL(szFile,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);nDownloaded = 1;COleDateTime dlStart = COleDateTime::GetCurrentTime();int filesize = fTargFile->SeekToEnd();fTargFile->SeekToBegin();outfs = filesize / 1024;// 计算文件大小(千字节)FileSize.Format("%d",outfs);// 以KB为单位格式文件大小// 在当前目录创建新的目标文件CFile fDestFile(fTargFile->GetFileName(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);int byteswrite;// 写入文件的字节数int pos = 0;// 当前进度条的位置int nperc,kbrecv;// 进度条的百分比,获取到的数据大小(Kbs为单位)double secs,kbsec;// 记录秒数, 速度(KB/秒)// 如果文件名太长,缩短窗口的标题并在状态显示NewName = fTargFile->GetFileName();// 获取新文件名if(fTargFile->GetFileName().GetLength() >= 10){NewName = fTargFile->GetFileName().Mid(0,7);// 分割文件NewName = NewName + "...";}pwnd->SetDlgItemText(IDC_STAT,"正在下载...");m_Prog->SetRange32(0,filesize);while (byteswrite = fTargFile->Read(filebuf, 512))// 读取文件{if(nTerminate == 1)// 如果点击取消下载{fDestFile.Close();// 关闭我们的目标文件fTargFile->Close();// 关闭远程文件delete fTargFile;// 删除CStdioFile对象,以防止泄漏pwnd->SetDlgItemText(IDC_STAT,"下载时已被用户取消!"); // Set satus bar textAfxEndThread(0);// 结束下载线程}// 根据开始时间与当前时间比较,获取秒数COleDateTimeSpan dlElapsed = COleDateTime::GetCurrentTime() - dlStart;secs = dlElapsed.GetTotalSeconds();pos = pos + byteswrite;// 设置新的进度条位置fDestFile.Write(filebuf, byteswrite);// 将实际数据写入文件m_Prog->SetPos(pos);nperc = pos * 100 / filesize;// 进度百分比kbrecv = pos / 1024;// 获取收到的数据kbsec = kbrecv / secs;// 获取每秒下载多少(KB)Perc.Format("%d",nperc);// 格式化进度百分比KBin.Format("%d",kbrecv);// 格式化已下载数据大小(KB)KBsec.Format("%d",(int)kbsec);// 格式化下载速度(KB/秒)pwnd->SetDlgItemText(IDC_EDIT_FILESIZE,FileSize + "KB");// 远程文件大小pwnd->SetDlgItemText(IDC_EDIT_SIZEOK,KBin + "KB");// 已下载大小pwnd->SetDlgItemText(IDC_EDIT2,KBsec + "KB/秒");// 下载速度pwnd->SetDlgItemText(IDC_EDIT4,Perc + "%");// 进度百分比}// 下载完成,关闭文件fDestFile.Close();}catch(CInternetException *IE){CString strerror;TCHAR error[255];IE->GetErrorMessage(error,255); // 获取错误消息strerror = error;pwnd->SetDlgItemText(IDC_STAT,strerror);pwnd->SetDlgItemText(IDB_BTN_STOP,"Exit");nDownloaded = 0;delete fTargFile;IE->Delete();// 删除异常对象,以防止泄漏}// 恢复默认pwnd->SetDlgItemText(IDC_EDIT2,"Kb/秒");pwnd->SetDlgItemText(IDC_EDIT3,"Loading...");pwnd->SetDlgItemText(IDC_EDIT4,"0%");delete fTargFile;if(nDownloaded == 1){pwnd->SetDlgItemText(IDC_STAT,"下载完成!");bStart->EnableWindow(TRUE);}return 0;}

1、下载线程函数:




原创粉丝点击