简介本文介绍一个C++代码片段:C++通过HTTP下载文件,感兴趣的朋友可以参考一下。

代码片段

// 下载HTTP文件
bool DownloadHttpFile(CString strUrl, CString strSavePath)
{
	if (strUrl.IsEmpty() || strSavePath.IsEmpty())
	{
		return false;
	}
	CInternetSession session;
	CHttpConnection* pHttpConnection = NULL;
	CHttpFile* pHttpFile = NULL;
	bool bReturn = false;
	const int nTimeOut = 2000;
	session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); // 重试之间的等待延时
	session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); // 重试次数
	char* pszBuffer = NULL;
	try
	{
		// 打开一个URL
		pHttpFile = (CHttpFile*)session.OpenURL(strUrl.GetBuffer(), 1, INTERNET_FLAG_TRANSFER_ASCII | INTERNET_FLAG_RELOAD, NULL, 0);
		if (pHttpFile->SendRequest() == FALSE) return FALSE;

		DWORD dwStateCode;
		pHttpFile->QueryInfoStatusCode(dwStateCode);
		if (dwStateCode == HTTP_STATUS_OK)
		{
			HANDLE hFile = CreateFile(strSavePath, GENERIC_WRITE,
				FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
			if (hFile == INVALID_HANDLE_VALUE)
			{
				pHttpFile->Close();
				pHttpConnection->Close();
				session.Close();
				return FALSE;
			}
			char szInfoBuffer[1000]; // 返回消息
			DWORD dwFileSize = 0;	 // 文件长度
			DWORD dwInfoBufferSize = sizeof(szInfoBuffer);
			BOOL bResult = FALSE;
			bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,
				(void*)szInfoBuffer, &dwInfoBufferSize, NULL);
			dwFileSize = atoi(szInfoBuffer);
			const int BUFFER_LENGTH = 1024 * 10;
			pszBuffer = new char[BUFFER_LENGTH]; // 读取文件的缓冲
			DWORD dwWrite, dwTotalWrite;
			dwWrite = dwTotalWrite = 0;
			UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); // 读取服务器上数据
			while (nRead > 0)
			{
				WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL);
				dwTotalWrite += dwWrite;
				nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);
			}
			delete[] pszBuffer;
			pszBuffer = NULL;
			CloseHandle(hFile);
			bReturn = true;
		}
	}
	catch (...)
	{
		OutputDebugStringA("下载文件失败...");
	}
	if (pszBuffer != NULL)
	{
		delete[]pszBuffer;
	}
	if (pHttpFile != NULL)
	{
		pHttpFile->Close();
		delete pHttpFile;
	}
	if (pHttpConnection != NULL)
	{
		pHttpConnection->Close();
		delete pHttpConnection;
	}
	session.Close();
	return bReturn;
}



更多为你推荐