近期有一问题困扰我好久不得解决,盼有高手来帮一把:
我用基于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.   

    还不如用Indy的好http://lysoft.7u7.net
      

  2.   

    我用下面的组合,好象可以防止从缓存中读取:INTERNET_FLAG_HYPERLINK or     
    INTERNET_FLAG_NO_UI or         
    INTERNET_FLAG_RESYNCHRONIZE or 
    INTERNET_FLAG_PRAGMA_NOCACHE or
    INTERNET_FLAG_RELOAD or        
    INTERNET_FLAG_NO_CACHE_WRITE   
      

  3.   

    用以上组合好像也不行。
    -------------------
    曾经考虑过用INDY,但是,有时总出现“Connection reset by peer”的错误,不知道如何处理。
      

  4.   

    欢迎大家加入DELPHI程序员群1805366 ,一起交流技术!