MFC通过URL下载并保存文件代码 转载
http://blog.csdn.net/charlessimonyi/article/details/8666108?utm_source=tuicool&utm_medium=referral
?
我們知道,windows有關(guān)網(wǎng)絡(luò)連接的API在wininet.h里,而在MFC里,這些API被封裝成了類。
CInternetSession類:直接繼承自CObject類,該類用來建立與某個Internet服務(wù)器的會話
CInternetConnection類:幫助用戶管理與Internet服務(wù)器的連接,同時(shí)還提供一些函數(shù)完成和響應(yīng)服務(wù)器的通信
CInternetConnection類又派生出三個類:
CHttpConnection類:管理與HTTP服務(wù)器的連接
CFtpConnection類:用于管理與FTP服務(wù)器的連接
CGopherConnection類:管理與Gopher服務(wù)器的連接
?
我們要實(shí)現(xiàn)根據(jù)URL下載并保存文件,就需要CInternetSession、CHttpConnection、CHttpFile。
CHttpFile用來做什么呢?它可以關(guān)聯(lián)起URL指向的一個WEB對象,由于CHttpFile繼承與CFile,我們可以像讀取一個CFile文件一樣,把它從HTTP服務(wù)器上下載下來。
MFC就是通過對CHttpFile對象的讀寫來完成與HTTP服務(wù)器的對話的,包括GET/POST提交數(shù)據(jù),接收數(shù)據(jù)。
?
下面就是我自己寫的一個根據(jù)URL下載并保存文件的函數(shù),注意使用時(shí)需要在MFC項(xiàng)目的預(yù)編譯頭文件里加入#include <afxinet.h>,因?yàn)樯厦嫖姨岬降哪切╊惾吭谶@個頭文件里。
第一參數(shù)為URL,第二個參數(shù)為保存路徑。
返回值:
0:成功下載保存
-1:URL不正確
-2:建立網(wǎng)絡(luò)連接失敗
-3:向服務(wù)器發(fā)起GET請求失敗
-4:服務(wù)器不接受請求
-5:參數(shù)一不能為空
-6:參數(shù)二不能為空
-7:保存文件時(shí)創(chuàng)建或?qū)懭胛募?/p> 1 INT GetFile(const CString strUrl,const CString strSavePath) 2 { 3 //檢查傳入的兩個參數(shù) 4 if (strUrl.IsEmpty()) 5 return -5; 6 if (strSavePath.IsEmpty()) 7 return -6; 8 9 unsigned short nPort; //用于保存目標(biāo)HTTP服務(wù)端口 10 CString strServer, strObject; //strServer用于保存服務(wù)器地址,strObject用于保存文件對象名稱 11 DWORD dwServiceType,dwRet; //dwServiceType用于保存服務(wù)類型,dwRet用于保存提交GET請求返回的狀態(tài)號 12 13 //解析URL,獲取信息 14 if(!AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort)) 15 { 16 //解析失敗,該Url不正確 17 return -1; 18 } 19 //創(chuàng)建網(wǎng)絡(luò)連接對象,HTTP連接對象指針和用于該連接的HttpFile文件對象指針,注意delete 20 CInternetSession intsess; 21 CHttpFile *pHtFile = NULL; 22 //建立網(wǎng)絡(luò)連接 23 CHttpConnection *pHtCon = intsess.GetHttpConnection(strServer,nPort); 24 if(pHtCon == NULL) 25 { 26 //建立網(wǎng)絡(luò)連接失敗 27 intsess.Close(); 28 return -2; 29 } 30 //發(fā)起GET請求 31 pHtFile = pHtCon->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject); 32 if(pHtFile == NULL) 33 { 34 //發(fā)起GET請求失敗 35 intsess.Close(); 36 delete pHtCon;pHtCon = NULL; 37 return -3; 38 } 39 //提交請求 40 pHtFile->SendRequest(); 41 //獲取服務(wù)器返回的狀態(tài)號 42 pHtFile->QueryInfoStatusCode(dwRet); 43 if (dwRet != HTTP_STATUS_OK) 44 { 45 //服務(wù)器不接受請求 46 intsess.Close(); 47 delete pHtCon;pHtCon = NULL; 48 delete pHtFile;pHtFile = NULL; 49 return -4; 50 } 51 //獲取文件大小 52 UINT nFileLen = (UINT)pHtFile->GetLength(); 53 DWORD dwRead = 1; //用于標(biāo)識讀了多少,為1是為了進(jìn)入循環(huán) 54 //創(chuàng)建緩沖區(qū) 55 CHAR *szBuffer = new CHAR[nFileLen+1]; 56 TRY 57 { 58 //創(chuàng)建文件 59 CFile PicFile(strSavePath,CFile::modeCreate|CFile::modeWrite|CFile::shareExclusive); 60 while(dwRead>0) 61 { 62 //清空緩沖區(qū) 63 memset(szBuffer,0,(size_t)(nFileLen+1)); 64 //讀取到緩沖區(qū) 65 dwRead = pHtFile->Read(szBuffer,nFileLen); 66 //寫入到文件 67 PicFile.Write(szBuffer,dwRead); 68 } 69 //關(guān)閉文件 70 PicFile.Close(); 71 //釋放內(nèi)存 72 delete []szBuffer; 73 delete pHtFile; 74 delete pHtCon; 75 //關(guān)閉網(wǎng)絡(luò)連接 76 intsess.Close(); 77 } 78 CATCH(CFileException,e) 79 { 80 //釋放內(nèi)存 81 delete []szBuffer; 82 delete pHtFile; 83 delete pHtCon; 84 //關(guān)閉網(wǎng)絡(luò)連接 85 intsess.Close(); 86 return -7; //讀寫文件異常 87 } 88 END_CATCH 89 return 0; 90 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/wolfplan/p/5937965.html
總結(jié)
以上是生活随笔為你收集整理的MFC通过URL下载并保存文件代码 转载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (计算机组成原理)第七章输入和输出系统-
- 下一篇: 3-5:类与对象中篇——默认成员函数之运