标签: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;
}标签:c++
原文地址:http://blog.csdn.net/computer_liuyun/article/details/39341673