近期有一问题困扰我好久不得解决,盼有高手来帮一把:
我用基于WinInet 的Api函数InternetOpen,InternetConnnect,HttpOpenRequest,HttpSendRequest,HttpQueryInfo,InternetReadFile等下载文件.
成功下载没问题,但是,如果,第一次下载成功后,随即更新服务器上被下载的文件,以后再下载的,都是更新前的文件。为了防止从缓存中读取,对相关API参数作了强调:
   //Internet访问读取标记
   InternetFlag := INTERNET_FLAG_RELOAD + INTERNET_FLAG_NO_CACHE_WRITE +            INTERNET_FLAG_HYPERLINK+INTERNET_FLAG_PRAGMA_NOCACHE;
但是,问题依旧,下载的还是更新前的文件。部分代码如下:
   
 //********************************************************************************  
   //使用代理服务器
  InternetOpen(PChar(FTAgent),INTERNET_OPEN_TYPE_PROXY, PChar(FGetStyleString), Nil,0)
  .......
  //使用HTTP的默认端口下载
   hConnect := InternetConnect(hSession, PChar(HostName),
                                INTERNET_DEFAULT_HTTP_PORT, PChar(FTUserName), PChar(FTPassword), INTERNET_SERVICE_HTTP,0, 0);
  ......
  //Internet访问读取标记
   InternetFlag := INTERNET_FLAG_RELOAD + INTERNET_FLAG_NO_CACHE_WRITE +            INTERNET_FLAG_HYPERLINK+INTERNET_FLAG_PRAGMA_NOCACHE;
......
hRequest := HttpOpenRequest(hConnect, RequestMethod, PChar(FileName), 'HTTP/1.0',
                PChar(FTReferer), @AcceptType, InternetFlag, 0);\
......
if FTPostQuery = '' then
     HttpSendRequest(hRequest, nil, 0, nil, 0)
    else
     HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
                     PChar(FTPostQuery), Length(FTPostQuery));
......
dwIndex  := 0;
    dwBufLen := 1024;
    GetMem(Buf, dwBufLen);    FTResult := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
                              Buf, dwBufLen, dwIndex);
......
 if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then Break
        else
         if BytesToRead = 0 then Break
         else
          begin
           if FTToFile then
            BlockWrite(f, Data, BytesToRead)
           else
            begin
             TempStr := Data;
             SetLength(TempStr, BytesToRead);
             FTStringResult := FTStringResult + TempStr;
            end;           inc(BytesReaded, BytesToRead);
 
          end;
       end;

解决方案 »

  1.   

    InternetOpenUrl(Session,PChar(Url),niL,0,INTERNET_FLAG_NO_CACHE_WRITE,0);注意倒数第2个参数,是清空缓存的,好好查查这个函数的用法吧。
      

  2.   

    用Indy,自己控制,用WinINet是简单却有很多限制的http://lysoft.7u7.net
      

  3.   

    用IdHttp下载也不行:var
     fs: TFileStream;
    begin
     fs := TFileStream.Create('c:\99.zip', fmCreate);
     IdHttp1.Request.ProxyServer:='112.20.50.151';
     IdHttp1.Request.ProxyPort:=806;
     IdHTTP1.Get('Http://xxxxxx.xxx.xxx.xxxx/xx.zip', fs);
     fs.Free;
    end;但是,老是出错:Socket Error#10054 Connection Reset By Peer!
    请大侠们指教。
      

  4.   

    就是啊,Indy就很简单,我原来用Socket,后来干脆换了Indy.
      

  5.   

    IdHttp1的代理服务器用户名及密码怎么设置呢