1. 程式人生 > >CHttpFile下載檔案小例子

CHttpFile下載檔案小例子

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;
}