下载文件并显示进度条

 

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;
}

时间: 2024-08-20 17:11:09

下载文件并显示进度条的相关文章

Android使用AsyncTask下载图片并显示进度条功能

在Android中实现异步任务机制有两种方式,Handler和AsyncTask.这篇文章给大家介绍Android使用AsyncTask下载图片并显示进度条功能. AsyncTask下载图片并显示下载进度,异步类AsyncTask配合进度条,简练! public class AsyncTaskActivity2 extends Activity { private Button btnDown;//图片框 private ImageView ivImage;//图片URL private sta

android中实现OkHttp下载文件并带进度条

OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作.下面我们用OkHttp来下载文件并带进度条! 相关资料: 官网地址:http://square.github.io/okhttp/ github源码地址:https://github.com/square/okhttp 一.服务器端简单搭建 可以参考搭建本地Tomcat服务器及相关配置 这篇文章. 新建项目OkHttpServer,在WebContent目录下新建downloadfile目

Handler实现线程之间的通信下载文件动态更新进度条

1. 原理 每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息. 2. Message 初始化:一般使用Message.obtain()方法获取一个消息对象,该方法会检查Message对象池中是否存在可重复利用的对象,若无,才会new一个新对象. what:相当于Message的标识符,区别于其它消息. arg1.arg2:int类型,可传递整数. obj:objec

swing 下载文件时的进度条

Java swing中经常要使用到进度条,比如下载文件和拷贝文件时显示进度,如下图所示:  下载完成之后: 难点在于:在读取输入流的时候,实时更新进度条.  我自己定了一个规则: (1) 若输入流的大小小于1024,则字节数组的长度就是输入流的大小. <!--[if !supportLists]-->(1)      (2) <!--[endif]-->获取文件的大小,并平分为100等份,得到商1: <!--[if !supportLists]-->(2)       

wpf文件复制显示进度条效果

也有一些介绍,先看运行效果 xaml如下: xaml代码 <window x:class="wpfthreadtest.mainwindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" title="mainwindow"

php+ajax文件上传进度条

ajax|上传 代码分为以下部分: demo.php - 上传过程处理 PLAIN TEXTPHP: <?php include 'UploadProgressMeter.class.php'; $fileWidget = new UploadProgressMeter(); if ($fileWidget->uploadComplete()) {        // 上传完毕的时候,从iframe发送一个js到主窗口表示一切ok        echo $fileWidget->fin

Http 下载文件利用(response,request) 并显示进度条

http 下载文件利用(response,request) 并显示进度条 request 和 response 都比较好用 /// <summary>                /// http 下载文件             /// current thread download         /// </summary>                /// <param name="url">下载文件地址</param>  

asp.net WinForm下载文件并显示下载进度条教程

WinForm下载文件并显示下载进度示例  代码如下 复制代码 /// <summary> /// 显示进度 /// </summary> /// <param name="val"></param> private void ProgressBar_Value(int val) {     progressBar1.Value = val;     label1.Text = val.ToString() + "%"

python下载文件时显示下载进度的方法_python

本文实例讲述了python下载文件时显示下载进度的方法.分享给大家供大家参考.具体分析如下: 将这段代码放入你的脚本中,类似:urllib.urlretrieve(getFile, saveFile, reporthook=report) 第三个参数如下面的函数定义report,urlretrieve下载文件时会实时回调report函数,显示下载进度 def report(count, blockSize, totalSize): percent = int(count*blockSize*10