VC下载文件 + 显示进度条
在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释:
1、下载线程函数:
- 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下载文件显示进度条
VC下载文件显示进度条 逗比汪星人2009-09-18上传 by Koma http://blog.csd.net/wangningyu http://download.csdn.net/deta ...
- libcurl开源库在Win32程序中使用下载文件显示进度条实例
一.配置工程引用libcurl库 #define CURL_STATICLIB #include "curl/curl.h" #ifdef _DEBUG #pragma comme ...
- Android 下载文件 显示进度条
加入两个权限 一个是联网,另一个是读写SD卡 <uses-permission android:name="android.permission.INTERNET">& ...
- JS原生上传大文件显示进度条-php上传文件
JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M post_max_size = 10M memory_li ...
- 【转】C#中使用aria2c进行下载并显示进度条
[转自] C#中使用aria2c进行下载并显示进度条 - 云平台知识库 - 博客园https://www.cnblogs.com/littlehb/p/5782714.html 正则表达式的生成网站: ...
- webclient下载文件 带进度条
private void button1_Click(object sender, EventArgs e) { doDownload(textBox1.Text.Trim()); } private ...
- winform 下载文件显示进度和百分比
/// <summary> /// 下载完成 /// </summary> private void DownloadFileCompleted() { IsComlate = ...
- idhttp post 上传或下载时显示进度条
通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...
- idhttp post 上传或下载时显示进度条(对接idhttp1.OnWork事件)
通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...
随机推荐
- sql2012 新增 OFFSET/FETCH
SQL Server 对行数的排序提供了 TOP 筛选.SQL Server 2012 新增了 OFFSET 筛选. 一.TOP 筛选 如果有 ORDER BY 子句,TOP 筛选将根据排序的结果返回 ...
- react 学习之十月之思
学习新技术,最怕的莫过于自己抱着莫大的决心去学习,然发现没有学到东西,这是很可怕的事情,但是能坚持下去,一点一点的消化知识点,并且去理解它是什么?有什么用?该怎么去用?使用的时候需要注意些什么呢? 这 ...
- Velocity 模板引擎介绍
一.变量 1. 变量定义 #set($name =“velocity”) 2. 变量的使用 在模板文件中使用$name 或者${name} 来使用定义的变量.推荐使用${name} 这种格式,因为在模 ...
- android .9文件的一点处理
Android上面有很多平台,造成比较严重的碎片问题,适配比较困难,作为应用,一般都需要图文并茂,图片又是比较占资源的.面对缩放的问题,于是出来了矢量图片文件,作一点矢量处理,于是就是.9图片,IOS ...
- 将文件的编码格式转换为utf-8
背景:项目中有一些其他部门发过来的代码,编码格式有utf-8,也有GBK,而且是散乱在各个文件夹中的,处理起来十分的麻烦.我想把他们都转成统一的utf-8的格式.代码很简单,直接上代码好了. impo ...
- IP-MAC绑定导致网络故障
前段时间将一台服务器A的服务迁移至了另外一台服务器B,外网IP地址也顺带迁移过来了,结果网络出现了问题. 其中内网是畅通的,但是外网IP怎么都连不上另外一台路由C(B和C是在一个交换机下的,网段也相同 ...
- Mac 下显示隐藏文件
将下面的命令粘贴进终端,按提示操作即可(可能需要输入电脑密码) 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:d ...
- postgres 利用unique index代替 primay key
create UNIQUE INDEX uniq_index_piwik_log_action_idaction on piwik_log_action(idaction); 这样做的好处: 1. ...
- SSM配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- P1832 A+B Problem(再升级)
P1832 A+B Problem(再升级) 题目提供者 usqwedf 传送门 标签 动态规划 数论(数学相关) 洛谷原创 难度 普及/提高- 通过/提交 107/202 题目背景 ·题目名称是吸引 ...