今天问一个同学C++实现的下载链接下载并保存给定的文件,互联网搜索。看到这样的事情在网上。因此,改变下直接带来,因为他的代码是在VC++,我导入到VS2010中出现点小问题。所以改了下贴了个VS中亲測可执行的代码。在此记录下。

參考的资料   http://bbs.csdn.net/topics/390052882  感觉里面大家讨论的都不错

事实上这个使用到MFC中的一些函数。能够做成图形界面的。

以下贴下自己小小改动的代码

//#define _WIN32_WINNT 0x0502
#include <afx.h>
#include <afxinet.h>
#include <iostream>
using namespace std;
#define RECVPACK_SIZE 2048
bool DownloadSaveFiles(const char* url,const char* strSaveFile) {//下载文件并保存为新文件名称
bool ret=false;
CInternetSession Sess(_T("lpload"));
Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT , 5000); //5秒的连接超时
Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT , 5000); //5秒的发送超时
Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT , 5000); //5秒的接收超时
Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT , 5000); //5秒的发送超时
Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 5000); //5秒的接收超时
DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ; CHttpFile* cFile = NULL;
char *pBuf = NULL;
int nBufLen = 0 ;
do {
try{
cFile = (CHttpFile*)Sess.OpenURL((CString)url,1,dwFlag);
DWORD dwStatusCode;
cFile->QueryInfoStatusCode(dwStatusCode);
if (dwStatusCode == HTTP_STATUS_OK) {
//查询文件长度
DWORD nLen=0;
cFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, nLen);
//CString strFilename = GetFileName(url,TRUE);
nBufLen=nLen;
//cout << "nLen=" << nLen << endl;
if (nLen <= 0) break;// //分配接收数据缓存
pBuf = (char*)malloc(nLen+8);
ZeroMemory(pBuf,nLen+8); char *p=pBuf;
while (nLen>0) {
//每次下载8K
int n = cFile->Read(p,(nLen<RECVPACK_SIZE)?nLen:RECVPACK_SIZE);
//接收完毕退出循环
if (n <= 0) break;//
//接收缓存后移
p+= n ;
//剩余长度递减
nLen -= n ;
//cout << "nLen=" << nLen << endl;
} //假设未接收完中断退出
if (nLen != 0) break; //接收成功保存到文件 CFile file((CString)strSaveFile, CFile::modeCreate | CFile::modeWrite);
file.Write(pBuf,nBufLen);
file.Close();
ret = true;
}
} catch(...) {
cout << "异常" << endl;
break;//
}
} while(0); //释放缓存
if (pBuf) {
free(pBuf);
pBuf=NULL;
nBufLen = 0 ;
} //关闭下载连接
if (cFile) {
cFile->Close();
Sess.Close();
delete cFile;
}
return ret;
}
int main() {
//測试用例
if(DownloadSaveFiles("http://www.nirsoft.net/utils/nircmd.zip","d:/cppdld_nircmd.zip") == true)
{
cout << "下载成功" << endl;
}else{
cout << "下载失败"<< endl;
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

使用C++实现功能下载文件的更多相关文章

  1. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  2. 转:Http下载文件类 支技断点续传功能

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...

  3. 安卓使用WebView下载文件,安卓实现软件升级功能

    由于调用系统默认浏览器下载更新,造成用户体验非常不好,所以决定在webview中直接下载系统更新.然后直接安装. 由于要下载,所以必须用webview,联网权限这里不说了,直接写在manifafest ...

  4. springboot项目下载文件功能中-切面-导致的下载文件失败的bug

    背景:使用spring提供的 ResponseEntity 和Resource结合,实现的下载文件功能 bug:Resource已经加载到了文件, 并且通过 ResponseEntity 构建了响应, ...

  5. ionic实现下载文件并打开功能(file-transfer和file-opener2插件)

    作为一款app,下载文件功能,和打开文件功能,在某些场景下还是十分有必要的.使用cordova-plugin-file-transfer和cordova-plugin-file-opener2这两个插 ...

  6. python3 实现堡垒机功能(并发执行命令及上传下载文件)

    转载请注明出处,欢迎提出宝贵意见,谢谢! 功能介绍: 1.主机分组 登录后显示分组主机及主机数量 选择主机组后显示该主机组下所有主机信息,主机名及IP显示输入选择:1.执行命令利用线程并发组内所有主机 ...

  7. java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片

    因为业务的需要,公司产品要求商品详情页面有个下载的功能 找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法 跟同事沟通后发现他那里有个下载的方法,不过是C#写 ...

  8. ubuntu 安装新版的qq,可支持下载文件等常用功能

    说明:此版本的QQ基本完美,但是有个缺点就是历史记录有些会显示乱码! 注意:此方法能完美解决这篇文章http://www.cnblogs.com/EasonJim/p/7118693.html的所有问 ...

  9. SecureCRT上传和下载文件

    SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...

随机推荐

  1. MySQL 批量Dll操作(转)

    概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...

  2. CSS预处理器——Sass、LESS和Stylus实践

    CSS(Cascading Style Sheet)被译为级联样式表,做为一名前端从业人员来说,这个专业名词并不陌生,在行业中通常称之为“风格样式表(Style Sheet)”,它主要是用来进行网页风 ...

  3. UDP议定书图像高速传输无损失程序

    下面的程序实现UDP没有图像数据的高速传输协议损耗,测试数据egtest01图片库,实现PC和图像的传输嵌入式结束.变速箱+读写速度可以达到10+M/S.考 server端程序 #include &l ...

  4. 超人学院Hadoop大数据资源共享

    超人学院Hadoop大数据资源共享-----数据结构与算法(java解密版) http://yunpan.cn/cw5avckz8fByJ   訪问password b0f8 很多其它精彩内容请关注: ...

  5. 在WPF中使用PlaneProjection模拟动态3D效果

    原文:在WPF中使用PlaneProjection模拟动态3D效果 虽然在WPF中也集成了3D呈现的功能,在简单的3D应用中,有时候并不需要真实光影的3D场景.毕竟使用3D引擎会消耗很多资源,有时候使 ...

  6. Oracle使用并行建索引须要注意的问题

    建索引时.我们为了建索引快.会加上并行,加上并行之后.此列索引就会是并行了. 訪问有并行度的索引时,CBO可能可能会考虑并行运行.这可能会引发一些问题,如在server资源紧张的时候用并行会引起更加严 ...

  7. 桥模式设计模式进入Bridge

    Abstraction:抽象部分的父类,定义须要实现的接口. 维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstracti ...

  8. 非正确使用浮点数据由项目产生BUG讨论的问题

    乘分配 当小学学会了乘法分配.详细乘法分配:并与多个两个数相乘的,他们能够把这个数字乘以,然后加入.由于一个恒定.乘法分配律也能够使用表达式的定义"(a+b)×c = a×c+b×c&quo ...

  9. 【BZOJ 1642】 [Usaco2007 Nov]Milking Time 挤奶时间

    1642: [Usaco2007 Nov]Milking Time 挤奶时间 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 590  Solved: 3 ...

  10. POJ 1915-Knight Moves (单向BFS &amp;&amp; 双向BFS 比)

    主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...