CHttpFile下載檔案小例子
阿新 • • 發佈:2018-12-31
bool InternetDownload(const CString &strURL, const CString &strFN) { //此處第一個引數設為NULL會報錯,提示沒有ApplicationName,因此隨意設定一個 CInternetSession internetSession(L" ", 1, PRE_CONFIG_INTERNET_ACCESS, NULL, NULL, 0); BOOL bSucceed = TRUE; try { // 統一以二進位制方式下載 DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD; //子類對基類進行了強制型別轉換,利用函式開啟要下載的網址連結 wangsl //將要下載檔案的資訊 CHttpFile * pF = (CHttpFile*)internetSession.OpenURL(strURL, 1, dwFlag); // 得到檔案大小 CString str; pF->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, str); int nFileSize = _ttoi(str); //檔案大小,將字串轉換成整形 //int nTotalSize = nFileSize; if (pF != NULL) { //建立下載檔案,不存在就建立,存在就直接寫入 wangsl CFile cf; if (!cf.Open(strFN, CFile::modeCreate | CFile::modeWrite, NULL)) { return FALSE; } // BYTE Buffer[8192]; //為Buffer分配空間 wangsl ZeroMemory(Buffer, sizeof(Buffer)); int nReadLen = 0; while ((nReadLen = pF->Read(Buffer, sizeof(Buffer))) > 0) //每次讀取固定長度到Buffer中,返回實際讀取的長度 wangsl { cf.Write(Buffer, nReadLen); //在建立的檔案中寫入讀取的內容 wangsl nFileSize -= nReadLen; TRACE("剩餘:%d\n", nFileSize); } cf.Close(); pF->Close(); delete pF; } } catch (CInternetException& e) { char szBuffer[128]; ZeroMemory(szBuffer, sizeof(szBuffer)); LPTSTR buffer = NULL; MtoW(szBuffer,buffer); e.GetErrorMessage(buffer, sizeof(buffer), NULL); TRACE("InternetDownload, Exception: %s ", buffer); } catch (...) { TRACE("InternetDownload, Exception: ... "); } internetSession.Close(); if (!bSucceed) DeleteFile(strFN); return bSucceed; }