博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
下载文件并显示进度条
阅读量:7229 次
发布时间:2019-06-29

本文共 2643 字,大约阅读时间需要 8 分钟。

下载文件并显示进度条 - Fly - 从C开始

 

UINT DownloadFile(LPVOID pParam)

{
 CWnd*   pwnd = AfxGetMainWnd();
 CProgressCtrl* m_Prog = (CProgressCtrl*)pwnd->GetDlgItem(IDC_PROGRESS1);
 CButton*  bStart = (CButton*)pwnd->GetDlgItem(IDB_BTN_START);
 
 char    filebuf[512];
 CInternetSession netSession;
 CStdioFile   *fTargFile;
 int     outfs;
 CString    szFile,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/秒)
 
  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 text
    AfxEndThread(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;
}

转载地址:http://kzdfm.baihongyu.com/

你可能感兴趣的文章
2019年最火热的Golang项目
查看>>
可实现RSSD云硬盘120万IOPS的SPDK IO路径优化实践
查看>>
Vue项目部署遇到的坑(你肯定会遇到!)
查看>>
资源分享计划第三期 0511
查看>>
awk 文本处理
查看>>
【JSConf EU 2018】主题总结 (部分主题已有中文文章)
查看>>
JavaScript面向对象名词详解
查看>>
Java设计模式学习 - 责任链模式
查看>>
JVM,DVM,ART
查看>>
webgl滤镜--会呼吸的痛
查看>>
用Go语言实现微信支付SDK
查看>>
oauth2在php实践
查看>>
LeetCode.914 卡牌分组
查看>>
填坑app:compileDebugJavaWithJavac
查看>>
Android 100+行实现本地跳一跳辅助(不需要连接电脑)
查看>>
位状态的使用
查看>>
面试技术题笔记
查看>>
Myth源码解析系列之一-项目简介
查看>>
JS易混淆的方法整理
查看>>
iOS下JS与OC互相调用(八)--Cordova详解+实战
查看>>