| 
 //获取当前时间戳 
int GetUnixTime() 
{ 
 CTime time = CTime::GetCurrentTime(); 
 return (int)time.GetTime(); 
} 
 
CString FormatUnit(double nBytes) 
{ 
 char* units[5] = {"B", "KB", "MB", "GB", "TB"}; 
 int i; 
 for (i = 0; ((int)nBytes) >= 1024 && i < 4; i++) 
  nBytes /= 1024; 
 CString strResult; 
 strResult.Format("%.2f%s", nBytes, units[i]); 
 return strResult; 
} 
DWORD WINAPI DownloadFile(LPVOID pParam) 
{ 
 CInstallOnlineDlg* pWnd = (CInstallOnlineDlg*)AfxGetApp()->m_pMainWnd; 
 char                filebuf[512]; 
 CInternetSession    netSession; 
 CStdioFile          *fTargFile = NULL; 
 CString             szFile(DOWNLOAD_URL), FileSize, KBin, KBsec, NewName, Perc, strLeft, strRight; 
 int nDownloaded = 1; 
 try 
 { 
  pWnd->SetLeftString("正在校验下载地址..."); 
  fTargFile = netSession.OpenURL(szFile, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD); 
  int filesize = fTargFile->SeekToEnd(); 
  fTargFile->SeekToBegin(); 
  // 在当前目录创建新的目标文件   
  CFile fDestFile(fTargFile->GetFileName(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); 
  int byteswrite;     // 写入文件的字节数   
  int pos = 0;        // 当前进度条的位置   
  double kbsec;  // 记录秒数, 速度(KB/秒)   
  int secs; 
  
  pWnd->SetFileName(fTargFile->GetFileName()); 
  pWnd->m_progress.SetRange32(0, filesize); 
  int nStartTime = GetUnixTime(); 
  int nLastOutputTime = 0; 
  CString strFileSize = FormatUnit(filesize); 
  while (byteswrite = fTargFile->Read(filebuf, 512))   // 读取文件   
  { 
   // 根据开始时间与当前时间比较,获取秒数  
   int nCurrentTime = GetUnixTime(); 
   secs = nCurrentTime - nStartTime; 
   secs = secs == 0 ? 1 : secs; 
   pos = pos + byteswrite;                 // 设置新的进度条位置   
   fDestFile.Write(filebuf, byteswrite);   // 将实际数据写入文件   
   pWnd->m_progress.SetPos(pos); 
   if ((nCurrentTime - nLastOutputTime) > 1) 
   { 
    kbsec = pos / secs;                  // 获取每秒下载多少(KB) 
    CString strRecv = FormatUnit(pos); 
    CString strSpeed = FormatUnit(kbsec); 
    strLeft.Format("下载进度:%s/%s", strRecv.GetBuffer(), strFileSize.GetBuffer()); 
    pWnd->SetLeftString(strLeft); 
    strRight.Format("下载速度:%s/s", strSpeed.GetBuffer()); 
    pWnd->SetRightString(strRight); 
    nLastOutputTime = nCurrentTime; 
   } 
  } 
  // 下载完成,关闭文件   
  fDestFile.Close(); 
 } 
 catch (CInternetException *IE) 
 { 
  CString strerror; 
  TCHAR error[255]; 
  IE->GetErrorMessage(error, 255); // 获取错误消息   
  strerror = error; 
  pWnd->SetLeftString(strerror); 
  pWnd->SetRightString(""); 
  if (fTargFile) 
   delete fTargFile; 
  IE->Delete();                    // 删除异常对象,以防止泄漏   
  pWnd->SetDownloadStatus(FALSE);  
  pWnd->GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); 
  return 0; 
 } 
 if (fTargFile) 
  delete fTargFile; 
 if (nDownloaded == 1) 
 { 
  pWnd->SetLeftString("下载完成,请单击“安装”!"); 
  pWnd->m_btn.LoadBitmaps(IDB_BTN_INSTALL_NORMAL); 
  pWnd->m_btn.SizeToContent(); 
  pWnd->SetDownloadStatus(TRUE); 
  pWnd->GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); 
 } 
 return 0; 
} 
 |