VC——自动更新功能之下载文件及进度条显示

首先添加进度条控件,添加其关联的变量m_progress,先将进度条条初始化m_progress.SetPos(0);

然后调用下载函数InternetGetFile (CString szUrl,CString szFileName)
前一个参数是远程文件的路径及名称,后一个是本地保存文件的路径很名称,在这里远程文件路径必须要带http://前缀。

int CLOGIN::InternetGetFile (CString szUrl,CString szFileName)
{
char    filebuf[512];
 CInternetSession netSession;
 CStdioFile   *fTargFile;
 int     outfs;
 CString    szFile,FileSize,KBin,KBsec,NewName,Perc;
 
 try
 {
  szFile = szUrl;
  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为单位格式文件大小
  
  // 在当前目录创建新的目标文件
  CString strDestPath =szFileName;//下载文件存放位置
  
  CFile fDestFile(strDestPath, 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 + "...";
  }
  
  while (byteswrite = fTargFile->Read(filebuf, 512)) // 读取文件
  {
   // 根据开始时间与当前时间比较,获取秒数
   COleDateTimeSpan dlElapsed = COleDateTime::GetCurrentTime() - dlStart;
   secs = dlElapsed.GetTotalSeconds();
   pos = pos + byteswrite;     // 设置新的进度条位置
   
   fDestFile.Write(filebuf, byteswrite); // 将实际数据写入文件
   
   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/秒)
   m_progress.SetPos(nperc);
  }
  // 下载完成,关闭文件
  fDestFile.Close();
 }
 
 catch(CInternetException *IE)
 {
  CString strerror;
  TCHAR error[255];
  
  IE->GetErrorMessage(error,255); // 获取错误消息
  strerror = error;
  
  // nDownloaded = 0;
  //delete []fTargFile;
  IE->Delete();     // 删除异常对象,以防止泄漏
  return FALSE;
 }
 //delete fTargFile;
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值