Diese liegt an der BrowserCache des IE's, denn UrlDownloadtoFile fragt halt einfach nur den Ie, ob es ihm die Datei geben kann und der IE schaut zuerst in der Chare nach, ob die Datei vorhanden ist ...
Und wie lange eine Datei in der BrowserCache drin bleibt, daß hängt von den Einstellungen des IEs und von der WebSeite ab, wo die Datei her ist.
Eigentlich sollte es ausreichen, wenn man vor dem Download per UrlDownloadtoFile die Datei im Browser-Chache (IE) per DeleteUrlCacheEntry löscht.
DeleteUrlCacheEntry(PAnsiChar(URL));
Allerdings scheint dieses nicht immer zu funktionieren, also hab ich zusätzlich noch die Chachedatei nach jedem Downloadversuch gelöscht ... den Dateinamen der ChacheDatei hab ich mir wärend des Downloads zurückgeben lassen.
Den kompletten Code zu posten wäre wohl zuviel des Guten, also hier nur mal die wichtigsten Teile.
Ich laß mir also beim Download den Dateinamen der ChacheDatei (in der BrowserChache des IEs) übergeben und nach dem Download wird diese ChacheDatei gelöscht, so daß beim nächsten Downloadversuch der IE/UrlDownloadtoFile auf jeden Fall diese Datei neu herunterladen muß. (falls DeleteUrlCacheEntry funktioniert, dann wird sofort die neue Datei heruntergeladen)
Delphi-Quellcode:
Type cDownloadStatusCallback = Class(TObject, IUnknown, IBindStatusCallback)
Private
CacheDatei: String;
...
Function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULong; szStatusText: LPCWStr): HResult; StdCall;
...
End;
Delphi-Quellcode:
Function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULong; szStatusText: LPCWStr): HResult; StdCall;
Begin
Case ulStatusCode of
...
BINDSTATUS_CACHEFILENAMEAVAILABLE: CacheDatei := String(szStatusText);
End;
..
End;
Var cDownStatus: cDownloadStatusCallback;
Delphi-Quellcode:
DeleteUrlCacheEntry(PAnsiChar(
URL));
cDownStatus := cDownloadStatusCallBack.Create;
Try
...
cDownStatus.CacheDatei := '
';
URLDownloadToFile(
nil, PChar(
URL), PChar(Dateiname), 0, CDownStatus);
If cDownStatus.CacheDatei <> '
'
Then DeleteUrlCacheEntry(PAnsiChar(cDownStatus.CacheDatei));
Finally
cDownStatus.Free;
End;
DeleteUrlCacheEntry(PAnsiChar(
URL));