想写个简单的函数从网上下载文件,在 OprnUrl 时总是失败,大家帮帮忙,谢谢代码如下:
BOOL DownloadFile(LPCSTR pstrURL, LPCSTR pstrSaveFileName, BOOL bBinary = TRUE)
{
CInternetSession sess;
CStdioFile *pHttpFile = NULL; DWORD dwHttpFlag = INTERNET_OPEN_TYPE_PRECONFIG
| INTERNET_FLAG_EXISTING_CONNECT
| INTERNET_FLAG_NO_AUTO_REDIRECT
// | INTERNET_FLAG_RELOAD
| INTERNET_FLAG_NO_COOKIES
// | INTERNET_FLAG_DONT_CACHE
// | INTERNET_FLAG_PRAGMA_NOCACHE
| INTERNET_FLAG_MAKE_PERSISTENT
; UINT nSaveFlag = CFile::modeCreate | CFile::modeWrite;
if(bBinary)
{
dwHttpFlag |= INTERNET_FLAG_TRANSFER_BINARY;
nSaveFlag |= CFile::typeBinary;
}
else
{
dwHttpFlag |= INTERNET_FLAG_TRANSFER_ASCII;
nSaveFlag |= CFile::typeText;
} try
{
sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,32000);
sess.SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
sess.SetOption(INTERNET_OPTION_CONNECT_RETRIES,5);
pHttpFile = sess.OpenURL(pstrURL, 1, dwHttpFlag);
}
catch(CInternetException *e)
{
TCHAR tszErr[1024];
if(e->GetErrorMessage(tszErr, sizeof(tszErr)))
{
AfxMessageBox(tszErr);
}
e->Delete();
return FALSE;
} if(NULL == pHttpFile)
{
return FALSE;
} CStdioFile fout;
if( !fout.Open(pstrSaveFileName, nSaveFlag) )
{
delete pHttpFile;
sess.Close();
return FALSE;
} if(bBinary)
{
#define BUF_LEN 1024 * 8
BYTE tszBuff[BUF_LEN] = {0};
UINT nRead = 0;
while( (nRead = pHttpFile->Read(tszBuff, BUF_LEN)) > 0)
{
fout.Write(tszBuff, nRead);
}
#undef BUF_LEN
}
else
{
CString str = _T("");
while(pHttpFile->ReadString(str))
{
str += _T("\n");
fout.WriteString(str);
}
}
fout.Close(); delete pHttpFile;
sess.Close(); return TRUE;
}只有极少数时候能成功,绝大多数都会失败?
另外试着用 URLDownloadToFile 函数下载也是有时成功有时失败?
BOOL DownloadFile(LPCSTR pstrURL, LPCSTR pstrSaveFileName, BOOL bBinary = TRUE)
{
CInternetSession sess;
CStdioFile *pHttpFile = NULL; DWORD dwHttpFlag = INTERNET_OPEN_TYPE_PRECONFIG
| INTERNET_FLAG_EXISTING_CONNECT
| INTERNET_FLAG_NO_AUTO_REDIRECT
// | INTERNET_FLAG_RELOAD
| INTERNET_FLAG_NO_COOKIES
// | INTERNET_FLAG_DONT_CACHE
// | INTERNET_FLAG_PRAGMA_NOCACHE
| INTERNET_FLAG_MAKE_PERSISTENT
; UINT nSaveFlag = CFile::modeCreate | CFile::modeWrite;
if(bBinary)
{
dwHttpFlag |= INTERNET_FLAG_TRANSFER_BINARY;
nSaveFlag |= CFile::typeBinary;
}
else
{
dwHttpFlag |= INTERNET_FLAG_TRANSFER_ASCII;
nSaveFlag |= CFile::typeText;
} try
{
sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,32000);
sess.SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
sess.SetOption(INTERNET_OPTION_CONNECT_RETRIES,5);
pHttpFile = sess.OpenURL(pstrURL, 1, dwHttpFlag);
}
catch(CInternetException *e)
{
TCHAR tszErr[1024];
if(e->GetErrorMessage(tszErr, sizeof(tszErr)))
{
AfxMessageBox(tszErr);
}
e->Delete();
return FALSE;
} if(NULL == pHttpFile)
{
return FALSE;
} CStdioFile fout;
if( !fout.Open(pstrSaveFileName, nSaveFlag) )
{
delete pHttpFile;
sess.Close();
return FALSE;
} if(bBinary)
{
#define BUF_LEN 1024 * 8
BYTE tszBuff[BUF_LEN] = {0};
UINT nRead = 0;
while( (nRead = pHttpFile->Read(tszBuff, BUF_LEN)) > 0)
{
fout.Write(tszBuff, nRead);
}
#undef BUF_LEN
}
else
{
CString str = _T("");
while(pHttpFile->ReadString(str))
{
str += _T("\n");
fout.WriteString(str);
}
}
fout.Close(); delete pHttpFile;
sess.Close(); return TRUE;
}只有极少数时候能成功,绝大多数都会失败?
另外试着用 URLDownloadToFile 函数下载也是有时成功有时失败?
INTERNET_FLAG_FROM_CACHE
标记,本地缓存中有相应的文件时才成功,其它标记组合只要是从网络下载就会出现无法解析的问题