Как я могу предотвратить извлечение URLDownloadToFile из кеша?

Я использую URLDownloadToFile для получения файла с веб-сайта. Последующие вызовы возвращают исходный файл, а не обновленную версию. Я предполагаю, что он извлекает кешированную версию.


person AlanKley    schedule 16.09.2008    source источник


Ответы (4)


Вызовите DeleteUrlCacheEntry с тем же URL-адресом непосредственно перед вызовом URLDownloadToFile. Вам нужно будет сделать ссылку на Wininet.lib

person AlanKley    schedule 16.09.2008

Да, по умолчанию загружается кешированная версия файла. Чтобы полностью избежать кэш-файла, передайте объект IBindStatusCallback в параметре lpfnCB функции URLDownloadToFile(). В вашем реализованном методе IBindStatusCallback::GetBindInfo() включите флаг BINDF_GETNEWESTVERSION и, необязательно, также флаг BINDF_NOWRITECACHE в значение, которое вы возвращаете через параметр grfBINDF. Если вы хотите, чтобы файл кеша, если он есть, обновлялся вместо пропуска, вместо этого укажите флаг BINDF_RESYNCHRONIZE.

person Remy Lebeau    schedule 03.09.2009
comment
Не могли бы вы показать пример? Я проверил указатель и использовал or в таких значениях, и он по-прежнему использовал кэшированное значение: *grfBINDF |= BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE; - person jla; 11.09.2013
comment
У меня нет примера, чтобы привести. То, что я сказал, является задокументированным поведением в MSDN. Попробуйте заменить |= на =, например: *grfBINDF = BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE; Поскольку у вас есть это, вы сохраняете существующие биты, поэтому, если переменная не инициализирована на стороне вызывающей стороны, результат может закончиться случайными битами, которые вам не нужны, например BINDF_OFFLINEOPERATION или BINDF_GETFROMCACHE_IF_NET_FAIL. Всегда обнуляйте выходные флаги перед назначением их битов. - person Remy Lebeau; 11.09.2013

Не могли бы вы добавить безобидный параметр запроса в конец URL-адреса?

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

person Shawn Miller    schedule 16.09.2008

очистить кеш

// 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;
person user3122475    schedule 20.12.2013