VC++下载文件线程 有进度条 百分比

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/秒)
		
		// 如果文件名太长,缩短窗口的标题并在状态显示
		NewName = fTargFile->GetFileName();					// 获取新文件名
		
		if(fTargFile->GetFileName().GetLength() >= 10)
		{
			NewName = fTargFile->GetFileName().Mid(0,7);	// 分割文件
			NewName = NewName + "...";
		}
		
		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;
}

1、下载线程函数:




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值