#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