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
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
相关文章推荐
- VC下载文件显示进度条
- VC下载文件 + 显示进度条
- 利用curl下载文件(进度条显示) 代码片段
- Symbian中Http下载文件引擎,支持进度显示
- (二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- android AsyncTask下载文件并且显示进度
- NSURLConnection下载文件并显示进度
- C# Winform下载文件并显示进度条
- Windows Phone 7 文件下载进度和速度显示
- NSURLConnection下载文件并显示进度(HEAD)
- NSURLConnection下载文件时,如何显示进度
- [vc]复制文件时显示复制进度
- 用BCB的INDY组件中的IDHTTP 下载文件并显示出进度条
- C# Winform下载文件并显示进度条
- C++Builder利用URLDownloadToFile下载文件并显示进度
- C#下载文件并显示显示进度的方法实现
- C#下载文件(可显示进度)的方法实现
- Winfrom 线程实现 http、https 文件下载 显示下载进度详情
- NSURLConnection下载文件并显示进度(HEAD)
- NSURLConnection下载文件时,如何显示进度