您的位置:首页 > 其它

VC下载文件 + 显示进度条

2016-10-03 06:40 260 查看
codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释:

1、下载线程函数:

[cpp] view plain copy

print?

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;

}

2、程序运行效果:



3、源码下载:

http://download.csdn.net/source/1674247

http://www.rayfile.com/files/047e5e02-a3a6-11de-9dba-0014221b798a/
http://blog.csdn.net/wangningyu/article/details/4564818
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: