// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
//define _WIN32_WINNT 0x0502
#include "stdafx.h"
#include"windows.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"));//这个在头文件afx.h里面
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 _tmain(int argc, _TCHAR* argv[])
{
//测试用例
if (DownloadSaveFiles("https://nj02all01.baidupcs.com/file/610c518897d2b2c2e926dea4ec3479aa?bkt=p3-1400610c518897d2b2c2e926dea4ec3479aa6b0ee2f1000000005400&fid=1385520889-250528-801743656234146&time=1473385355&sign=FDTAXGERBH-DCb740ccc5511e5e8fedcff06b081203-VIHi1jRLlJUxd4i0s9LsZ747jhM%3D&to=nj2hb&fm=Yan,B,T,t&sta_dx=21504&sta_cs=1&sta_ft=exe&sta_ct=1&sta_mt=1&fm2=Yangquan,B,T,t&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=1400610c518897d2b2c2e926dea4ec3479aa6b0ee2f1000000005400&expires=8h&rt=sh&r=397272790&mlogid=5853974854801757197&vuk=1385520889&vbdid=3657123245&fin=helper.exe&fn=helper.exe&slt=pm&uta=0&rtype=1&iv=0&isw=0&dp-logid=5853974854801757197&dp-callid=0.1.1&hps=1&csl=0&csign=jq6%2BHtpAALBTzxw6VDBQA7h3fCY%3D", "f:/help.exe") == true)
{
cout << "下载成功" << endl;
}
else{
cout << "下载失败" << endl;
}
return 0;
}
本文介绍了一个使用C++实现的网络文件下载程序示例。该程序利用了CInternetSession类来创建会话,并设置超时选项,通过CHttpFile进行文件下载,将远程文件保存到本地指定路径。
655

被折叠的 条评论
为什么被折叠?



