用C++实现下载文件的功能

今天同学问了个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;
}
时间: 2024-08-01 05:59:54

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

Java中实现FTP上传下载文件的功能,完整代码

一个JAVA 实现FTP功能的代码,包括了服务器的设置模块,并包括有上传文件至FTP的通用方法.下载文件的通用方法以及删除文件.在ftp服务器上穿件文件夹.检测文件夹是否存在等,里面的有些代码对编写JAVA文件上传或许有参考价值,Java FTP主文件代码: package ftpDemo;         import java.io.DataOutputStream;         import java.io.InputStream;         import java.io.Out

使用Servlet实现下载文件的功能

在前台有一个下载链接,比如 <a href="DownLoadServlet">下载</a> <br/> 使用Servlet实现下载: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import java

C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能.首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer来设置隔多长时间来下载.后来又想想了.用windwos服务来实现吧. 效果图: 执行的Log日志: INFO-2016/5/24 0:30:07--日志内容为:0/30/7进行time触发 INFO-2016/5/24 1:30:07--日志内容为:1/30/7进行time触发 INFO-2016/

java按http地址列表下载文件队列

本文实现的功能是通过url列表下载文件队列,http url地址如:http://172.16.53.187:8080/LiveDownServer/Media/DownloadFile?path=E%3A%2Fvideofiles%2Ftest123%2Fdevelop%2F2015%2F06%2F12%2Fts%2F12%2F20150612124328.ts 路径经过了编码,可以利用java自带函数java.net.URLDecoder.decode进行解码,解码之后添加到url列表利用H

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

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

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

因为调用系统默认浏览器下载更新,造成用户体验很不好,所以决定在webview中直接下载系统更新,然后直接安装. 因为要下载,所以必须用webview,联网权限这里不说了,直接写在manifafest中. 我们常用的下载都是调用Android默认浏览器 这样写 1.设置WebView的DownloadListener: webView.setDownloadListener(new MyWebViewDownLoadListener()); 2.实现MyWebViewDownLoadListene

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

背景:使用spring提供的 ResponseEntity 和Resource结合,实现的下载文件功能 bug:Resource已经加载到了文件, 并且通过 ResponseEntity 构建了响应,但是页面接收不到文件. 原因:目前初步发现是因为我使用的捕获异常的切面导致的,具体切面怎么会导致 响应结构 的改变,暂时没有搞明白,后续研究透了再补充 解决办法:把下载文件的接口排除在切面处理的范围外,就好了. 吃一堑长一智:浪费了差不多一天的时间在这个问题上,很苦恼,希望下次能使用排除法,更高效的

如何用 JavaScript 下载文件

简介 我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好.幸好,HTML 5 里面为 <a> 标签添加了一个 download 的属性,我们可以轻易的利用它来实现下载功能,再也不需要用以前的笨办法了. 原理 我们先看看 download 的使用方法: <a href="http://somehost/somefile.zip" download=&quo

java实现FTP下载文件

ftp上传下载文件,是遵照ftp协议上传下载文件的,本例仅以下载文件为例. 重要的方法解释: 1.FTP功能相关依赖路径:org.apache.commons.net.ftp.*: 2.ftp默认端口是21,如果非默认端口连接,需指定:ftp.connect(ftphostaddr, 22);//22为端口号 3.ftp.changeWorkingDirectory(ftppath) //实现切换目录 4.FTPFile[] fs = ftp.listFiles(); 获取指定目录下的文件列表