#include <afx.h>
#include <afxinet.h>
#define RECVPACK_SIZE 2048
bool DownloadSaveFiles(char* url,char *strSaveFile) {//下載文件並保存為新文件名
bool ret=false;
CInternetSession Sess("lpload");
Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT , 2000); //2秒的連接超時
Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT , 2000); //2秒的發送超時
Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT , 2000); //2秒的接收超時
Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT , 2000); //2秒的發送超時
Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 2000); //2秒的接收超時
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(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;
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 ;
}
//如果未接收完中斷退出
if (nLen != 0) break;
//接收成功保存到文件
CFile file(strSaveFile, CFile::modeCreate | CFile::modeWrite);
file.Write(pBuf,nBufLen);
file.Close();
ret = true;
}
} catch(...) {
break;//
}
} while(0);
//釋放緩存
if (pBuf) {
free(pBuf);
pBuf=NULL;
nBufLen = 0 ;
}
//關閉下載連接
if (cFile) {
cFile->Close();
Sess.Close();
delete cFile;
}
return ret;
}
int main() {
DownloadSaveFiles("http://www.nirsoft.net/utils/nircmd.zip","d:\\cppdld_nircmd.zip");
return 0;
}
http://bbs.csdn.net/topics/390052882

