【发布时间】:2010-09-09 16:18:31
【问题描述】:
我正在使用 URLDownloadToFile 从网站检索文件。后续调用返回原始文件而不是更新版本。我假设它正在检索缓存版本。
【问题讨论】:
我正在使用 URLDownloadToFile 从网站检索文件。后续调用返回原始文件而不是更新版本。我假设它正在检索缓存版本。
【问题讨论】:
在调用 URLDownloadToFile 之前使用相同的 URL 调用 DeleteUrlCacheEntry。 您需要链接到 Wininet.lib
【讨论】:
能否在 URL 末尾添加一个无害的查询参数?
【讨论】:
是的,默认情况下它正在拉取文件的缓存版本。要完全避免缓存文件,请在 lpfnCB 中传递一个 IBindStatusCallback 对象 URLDownloadToFile() 的参数。在您实现的 IBindStatusCallback::GetBindInfo() 方法中,在您通过 grfBINDF 参数返回的值中包含 BINDF_GETNEWESTVERSION 标志和可选的 BINDF_NOWRITECACHE 标志。如果您希望更新缓存文件(如果存在)而不是跳过,请指定 BINDF_RESYNCHRONIZE 标志。
【讨论】:
|= 替换为=,例如:*grfBINDF = BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE; 正如您所拥有的那样,您将保留现有位,因此如果变量在调用者端未初始化,那么结果可能会以您不想要的随机位结束,例如 BINDF_OFFLINEOPERATION 或 BINDF_GETFROMCACHE_IF_NET_FAIL。在分配它们的位之前始终将输出标志清零。
清理缓存
// 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;
【讨论】: