想写个简单的函数从网上下载文件,在 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 函数下载也是有时成功有时失败?

解决方案 »

  1.   

    测试结果加上了
    INTERNET_FLAG_FROM_CACHE
    标记,本地缓存中有相应的文件时才成功,其它标记组合只要是从网络下载就会出现无法解析的问题
      

  2.   

    自己找到原因了,说出来有点可笑,就是防火墙的原因我用的是 LnS 防火墙,突然想到这个程序要访问网络为什么 LnS 无任何提示?原来我禁止了 VC 连接网络及禁止 VC 调用其它文件连接网线,所以在 VC 环境下运行程序时根本没有任何提示,直接禁止了。到资源管理器中直接运行生成的文件,下载成功。