首先添加进度条控件,添加其关联的变量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;
}