用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;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。