1. 程式人生 > >c++下載檔案(考慮瀏覽器緩衝)

c++下載檔案(考慮瀏覽器緩衝)

CString DownloadFile(CString strURL,int type)
{
	//初始化資料
	//BYTE datalen[5];
	int len = 0;
	CHttpFile* pfile = NULL;
	CInternetSession session("HttpClient");
    session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 10 * 1000) ;
	//session.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 1000*15);
	//session.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 1000*10);
    session.SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1000) ;
    session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 2) ;

	//char m_buffer[1000];
	//memset(m_buffer,0x00,len);
	CString strData;

	try
	{
		//這裡加入引數,否則第二次抓取相同檔案時會獲取緩衝區資料,導致資料沒更新   2009-2-3 shenay	
		//													使用文字資料	  |	強制重讀取資料		| 不保留緩衝區
		pfile = (CHttpFile *)session.OpenURL(strURL,1,INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE);
		DWORD dwStatusCode;
		pfile->QueryInfoStatusCode(dwStatusCode);//返回網路請求狀態引數

		//若能讀到網路資料,則開始解析DAY檔案
		if(dwStatusCode==HTTP_STATUS_OK)
		{
			CString cslen;
			pfile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,cslen);
			len = atoi(cslen);

			char *pBuffer = new char[len+1];
			int backlen = pfile->Read(pBuffer,len);

			if(type == 0)
			{
				strData = pBuffer;
				strData = strData.Left(len);
			}
			else if(type == 1)
			{
				CFile file;
				if(file.Open(m_strSysConfig,CFile::modeCreate|CFile::modeWrite))
				{
					file.Write(pBuffer,len);
					file.Close();
				}
			}
			else if(type == 2)
			{
				char path[255];
				SHGetSpecialFolderPath(0,path,CSIDL_DESKTOPDIRECTORY,0);
				CString strSavePath(path);
				strSavePath +=  "\\新版新聞操作程式.rar";

				//解密
				for(int i=0; i<len; i++)
					pBuffer[i] ^= 4182;

				CFile file;
				if(file.Open(strSavePath,CFile::modeCreate|CFile::modeWrite))
				{
					file.Write(pBuffer,len);
					file.Close();
				}
			}

			pfile->Close();
			delete pfile;
			delete []pBuffer;
		}
	}
	catch(CInternetException * pException)
	{
		CString strMsg = "驗證程式版本失敗,請確認網路連線狀況!\r\n";

		char szErr[1000];
		if(pException->GetErrorMessage(szErr,1000))
			strMsg += szErr;

		strData = szErr;
	}

	session.Close();
	delete session;

	return strData;
}