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、下载线程函数:
- VC++下载文件线程 有进度条 百分比
- Android百分比下载进度条
- Android百分比下载进度条
- VC下载文件 + 显示进度条
- Android中带有进度条百分比显示的可以从网络下载文件的适配器【单线程模式】
- ios使用AFN框架下载文件显示下载百分比带进度条
- ios AFNetworking 圆形进度条下载,显示百分比
- Android中带有进度条百分比显示的可以从网络下载文件的适配器
- 多线程断点下载(开始下载,暂停下载,百分比进度条)
- 多线程断点下载(开始下载,暂停下载,百分比进度条)
- 百分比进度条
- iphone下载进度条,显示下载字节数与百分比
- 从tomcat上下载MP3 带百分比进度条
- 实现 异步任务类 下载更新进度条,显示百分比
- 文件下载 进度条
- 文件下载 进度条
- 文件下载 进度条
- [进度条]文件下载
- TwentyEleven暗色系主题实现透明
- hdoj1074 Doing Homework【状压+bfs】
- js字符串常用判断方法
- centos 安装scp
- ShareSDK for iOS 2.6.0发布
- VC++下载文件线程 有进度条 百分比
- Yii快速入门教程
- 阿里巴巴集团去IOE运动的思考与总结
- IOCP底层,支持超过15000个连接
- 微软发补丁修复Win8.1安全启动水印Bug
- 【IOS中XML解析】NSXMLParser方法解析XML文件案例
- hdu 4474
- 对mysql explain讲的比较清楚的
- Cannot assign "u'1'": "Vote.design" must be a "Design" instance.