【问题标题】:How can I prevent URLDownloadToFile from retrieving from the cache?如何防止 URLDownloadToFile 从缓存中检索?
【发布时间】:2010-09-09 16:18:31
【问题描述】:

我正在使用 URLDownloadToFile 从网站检索文件。后续调用返回原始文件而不是更新版本。我假设它正在检索缓存版本。

【问题讨论】:

    标签: c++ winapi wininet


    【解决方案1】:

    在调用 URLDownloadToFile 之前使用相同的 URL 调用 DeleteUrlCacheEntry。 您需要链接到 Wininet.lib

    【讨论】:

      【解决方案2】:

      能否在 URL 末尾添加一个无害的查询参数?

      https://stackoverflow.com/?CacheBuster=1020am

      【讨论】:

        【解决方案3】:

        是的,默认情况下它正在拉取文件的缓存版本。要完全避免缓存文件,请在 lpfnCB 中传递一个 IBindStatusCallback 对象 URLDownloadToFile() 的参数。在您实现的 IBindStatusCallback::GetBindInfo() 方法中,在您通过 grfBINDF 参数返回的值中包含 BINDF_GETNEWESTVERSION 标志和可选的 BINDF_NOWRITECACHE 标志。如果您希望更新缓存文件(如果存在)而不是跳过,请指定 BINDF_RESYNCHRONIZE 标志。

        【讨论】:

        • 你能举个例子吗?我检查了指针并在这样的值中进行了或运算,它仍然使用缓存的值:*grfBINDF |= BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE;
        • 我没有示例可提供。我所说的是 MSDN 上记录的行为。尝试将|= 替换为=,例如:*grfBINDF = BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE; 正如您所拥有的那样,您将保留现有位,因此如果变量在调用者端未初始化,那么结果可能会以您不想要的随机位结束,例如 BINDF_OFFLINEOPERATIONBINDF_GETFROMCACHE_IF_NET_FAIL。在分配它们的位之前始终将输出标志清零。
        【解决方案4】:

        清理缓存

        // Limpa cache do Internet Explorer
        procedure DeletaIECache;
        var
             lpEntryInfo: PInternetCacheEntryInfo;
             hCacheDir: LongWord;
             dwEntrySize: LongWord;
        begin
             dwEntrySize := 0;
             FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize) ;
             GetMem(lpEntryInfo, dwEntrySize) ;
             if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
             hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize) ;
             if hCacheDir <> 0 then
             begin
                 repeat
                 DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName) ;
                 FreeMem(lpEntryInfo, dwEntrySize) ;
                 dwEntrySize := 0;
                 FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize) ;
                 GetMem(lpEntryInfo, dwEntrySize) ;
                 if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
                 until not FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize) ;
             end;
             FreeMem(lpEntryInfo, dwEntrySize) ;
             FindCloseUrlCache(hCacheDir) ;
        end;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多