Я использую URLDownloadToFile для получения файла с веб-сайта. Последующие вызовы возвращают исходный файл, а не обновленную версию. Я предполагаю, что он извлекает кешированную версию.
Как я могу предотвратить извлечение URLDownloadToFile из кеша?
Ответы (4)
Вызовите DeleteUrlCacheEntry с тем же URL-адресом непосредственно перед вызовом URLDownloadToFile. Вам нужно будет сделать ссылку на Wininet.lib
Да, по умолчанию загружается кешированная версия файла. Чтобы полностью избежать кэш-файла, передайте объект IBindStatusCallback в параметре lpfnCB функции URLDownloadToFile(). В вашем реализованном методе IBindStatusCallback::GetBindInfo() включите флаг BINDF_GETNEWESTVERSION и, необязательно, также флаг BINDF_NOWRITECACHE в значение, которое вы возвращаете через параметр grfBINDF. Если вы хотите, чтобы файл кеша, если он есть, обновлялся вместо пропуска, вместо этого укажите флаг BINDF_RESYNCHRONIZE.
|=
на =
, например: *grfBINDF = BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE;
Поскольку у вас есть это, вы сохраняете существующие биты, поэтому, если переменная не инициализирована на стороне вызывающей стороны, результат может закончиться случайными битами, которые вам не нужны, например BINDF_OFFLINEOPERATION
или BINDF_GETFROMCACHE_IF_NET_FAIL
. Всегда обнуляйте выходные флаги перед назначением их битов.
- person Remy Lebeau; 11.09.2013
Не могли бы вы добавить безобидный параметр запроса в конец URL-адреса?
https://stackoverflow.com/?CacheBuster=1020am
очистить кеш
// 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;