codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释:

1、下载线程函数:

  1. UINT DownloadFile(LPVOID pParam)
  2. {
  3. CWnd*           pwnd = AfxGetMainWnd();
  4. CProgressCtrl*  m_Prog = (CProgressCtrl*)pwnd->GetDlgItem(IDC_PROGRESS1);
  5. CButton*        bStart = (CButton*)pwnd->GetDlgItem(IDB_BTN_START);
  6. char                filebuf[512];
  7. CInternetSession    netSession;
  8. CStdioFile          *fTargFile;
  9. int                 outfs;
  10. CString             szFile,FileSize,KBin,KBsec,NewName,Perc;
  11. try
  12. {
  13. pwnd->GetDlgItemText(IDC_EDIT1,szFile);
  14. pwnd->SetDlgItemText(IDC_STAT,"正在校验下载地址...");
  15. fTargFile = netSession.OpenURL(szFile,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
  16. nDownloaded = 1;
  17. COleDateTime dlStart = COleDateTime::GetCurrentTime();
  18. int filesize = fTargFile->SeekToEnd();
  19. fTargFile->SeekToBegin();
  20. outfs = filesize / 1024;        // 计算文件大小(千字节)
  21. FileSize.Format("%d",outfs);    // 以KB为单位格式文件大小
  22. // 在当前目录创建新的目标文件
  23. CFile fDestFile(fTargFile->GetFileName(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
  24. int byteswrite;     // 写入文件的字节数
  25. int pos = 0;        // 当前进度条的位置
  26. int nperc,kbrecv;   // 进度条的百分比,获取到的数据大小(Kbs为单位)
  27. double secs,kbsec;  // 记录秒数, 速度(KB/秒)
  28. // 如果文件名太长,缩短窗口的标题并在状态显示
  29. NewName = fTargFile->GetFileName();                  // 获取新文件名
  30. if(fTargFile->GetFileName().GetLength() >= 10)
  31. {
  32. NewName = fTargFile->GetFileName().Mid(0,7); // 分割文件
  33. NewName = NewName + "...";
  34. }
  35. pwnd->SetDlgItemText(IDC_STAT,"正在下载...");
  36. m_Prog->SetRange32(0,filesize);
  37. while (byteswrite = fTargFile->Read(filebuf, 512))   // 读取文件
  38. {
  39. if(nTerminate == 1)                     // 如果点击取消下载
  40. {
  41. fDestFile.Close();                  // 关闭我们的目标文件
  42. fTargFile->Close();                  // 关闭远程文件
  43. delete fTargFile;                   // 删除CStdioFile对象,以防止泄漏
  44. pwnd->SetDlgItemText(IDC_STAT,"下载时已被用户取消!"); // Set satus bar text
  45. AfxEndThread(0);                    // 结束下载线程
  46. }
  47. // 根据开始时间与当前时间比较,获取秒数
  48. COleDateTimeSpan dlElapsed = COleDateTime::GetCurrentTime() - dlStart;
  49. secs = dlElapsed.GetTotalSeconds();
  50. pos = pos + byteswrite;                 // 设置新的进度条位置
  51. fDestFile.Write(filebuf, byteswrite);   // 将实际数据写入文件
  52. m_Prog->SetPos(pos);
  53. nperc = pos * 100 / filesize;           // 进度百分比
  54. kbrecv = pos / 1024;                    // 获取收到的数据
  55. kbsec = kbrecv / secs;                  // 获取每秒下载多少(KB)
  56. Perc.Format("%d",nperc);                // 格式化进度百分比
  57. KBin.Format("%d",kbrecv);               // 格式化已下载数据大小(KB)
  58. KBsec.Format("%d",(int)kbsec);          // 格式化下载速度(KB/秒)
  59. pwnd->SetDlgItemText(IDC_EDIT_FILESIZE,FileSize + "KB");// 远程文件大小
  60. pwnd->SetDlgItemText(IDC_EDIT_SIZEOK,KBin + "KB");       // 已下载大小
  61. pwnd->SetDlgItemText(IDC_EDIT2,KBsec + "KB/秒");      // 下载速度
  62. pwnd->SetDlgItemText(IDC_EDIT4,Perc + "%");              // 进度百分比
  63. }
  64. // 下载完成,关闭文件
  65. fDestFile.Close();
  66. }
  67. catch(CInternetException *IE)
  68. {
  69. CString strerror;
  70. TCHAR error[255];
  71. IE->GetErrorMessage(error,255); // 获取错误消息
  72. strerror = error;
  73. pwnd->SetDlgItemText(IDC_STAT,strerror);
  74. pwnd->SetDlgItemText(IDB_BTN_STOP,"Exit");
  75. nDownloaded = 0;
  76. delete fTargFile;
  77. IE->Delete();                    // 删除异常对象,以防止泄漏
  78. }
  79. // 恢复默认
  80. pwnd->SetDlgItemText(IDC_EDIT2,"Kb/秒");
  81. pwnd->SetDlgItemText(IDC_EDIT3,"Loading...");
  82. pwnd->SetDlgItemText(IDC_EDIT4,"0%");
  83. delete fTargFile;
  84. if(nDownloaded == 1)
  85. {
  86. pwnd->SetDlgItemText(IDC_STAT,"下载完成!");
  87. bStart->EnableWindow(TRUE);
  88. }
  89. return 0;
  90. }

2、程序运行效果:

3、源码下载:

http://download.csdn.net/source/1674247

http://www.rayfile.com/files/047e5e02-a3a6-11de-9dba-0014221b798a/

http://blog.csdn.net/wangningyu/article/details/4564818

VC下载文件 + 显示进度条的更多相关文章

  1. VC下载文件显示进度条

    VC下载文件显示进度条 逗比汪星人2009-09-18上传   by Koma http://blog.csd.net/wangningyu http://download.csdn.net/deta ...

  2. libcurl开源库在Win32程序中使用下载文件显示进度条实例

    一.配置工程引用libcurl库 #define CURL_STATICLIB #include "curl/curl.h" #ifdef _DEBUG #pragma comme ...

  3. Android 下载文件 显示进度条

    加入两个权限 一个是联网,另一个是读写SD卡 <uses-permission android:name="android.permission.INTERNET">& ...

  4. JS原生上传大文件显示进度条-php上传文件

    JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M    post_max_size = 10M    memory_li ...

  5. 【转】C#中使用aria2c进行下载并显示进度条

    [转自] C#中使用aria2c进行下载并显示进度条 - 云平台知识库 - 博客园https://www.cnblogs.com/littlehb/p/5782714.html 正则表达式的生成网站: ...

  6. webclient下载文件 带进度条

    private void button1_Click(object sender, EventArgs e) { doDownload(textBox1.Text.Trim()); } private ...

  7. winform 下载文件显示进度和百分比

    /// <summary> /// 下载完成 /// </summary> private void DownloadFileCompleted() { IsComlate = ...

  8. idhttp post 上传或下载时显示进度条

    通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...

  9. idhttp post 上传或下载时显示进度条(对接idhttp1.OnWork事件)

    通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...

随机推荐

  1. 安卓数据存储(3):SQLite数据库存储

    SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLit ...

  2. 一个react的完整项目展示

    和一些人的关系像平行线,一辈子相守相望,见于眼底藏于心间.就怕耐不住寂寞,冲动而成了相交线,在一个点尽情拥抱,从此便离得越来越远,再也不见.遇到这样的人,因为不想做恋人只能一时,所以才选择做朋友能一世 ...

  3. 读《编写高质量代码:改善JavaScript程序的188个建议》1

    建议3:减少全局变量污染 定义全局变量有3种方式: ❑在任何函数外面直接执行var语句. var f='value'; ❑直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中, ...

  4. sqlserver2008中如何用右键可视化的设置外键

    右键->设计 然后打表设计界面打开了然后右键点你要设置与其它表关联的列然后点关系,选择外键表与列然后点保存,就这样  

  5. jpGraph的应用及基本安装配置 BY 命运

    1.---jpGraph其实就是一个图表类库,会让开发者们作图非常方便,只要几行代码就可以勾画出非常炫的图表. 官方下载地址是:http://jpgraph.net/download/   jpGra ...

  6. A Swift Tour(3) - Functions and Closures

    Functions and Closures 使用func来声明函数,通过括号参数列表的方式来调用函数,用 --> 来分割函数的返回类型,参数名和类型,例如: func greet(name: ...

  7. 那天有个小孩跟我说LINQ(五)转载

    2  LINQ TO SQL(代码下载)      我们以一个简单的销售的业务数据库为例子         表结构很简单:Users(购买者(用户)表),Products(产品信息表),Sales(销 ...

  8. 关于C++对汉字拼音的处理(3)

    之所以汉字转拼音的博文能出到3,主要是因为没有很完美的C++的解决方案,但是写到了这里可以有一个小结了. 以前的方法都有这种那种弊端,如果出现了无法识别的汉字(简体的)就无法修改处理了,但是下面的这种 ...

  9. boost库----enable_shared_from_this类的作用和实现原理

    使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_thi ...

  10. u-boot和linux的机器码

    先看u-boot的机器码和linux的机器码是在什么地方决定的. 1. u-boot的机器码是在u-boot的board/fs2410/fs2410.c文件里决定的:     /* arch numb ...