c++下載檔案(考慮瀏覽器緩衝)
阿新 • • 發佈:2019-01-08
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; }