| Autor |
Beitrag |
JRegier
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Di 11.10.05 13:04
Hi, wie erhalte ich mit:
Delphi-Quelltext 1: 2:
| IdHTTP.Head(URL); ImageDate := IdHTTP.Response.LastModified; |
das richtige Datum einer Bilddatei?
Muß ich sonst noch Befehle zwischenschieben damit das funktioniert?
Moderiert von raziel: Delphi-Tags hinzugefügt.
|
|
Hansi@OMG
      
Beiträge: 304
Vista
Delphi 2006 Prof., Lazarus
|
Verfasst: Di 11.10.05 16:19
So funktioniert das doch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); var zeit : tdate; begin idhttp1.Head(edit1.text); zeit:=idhttp1.Response.LastModified; label1.Caption:=datetostr(zeit); end; |
_________________ Who doesn't know the Micrsoft developer "Mahatma Fatal Error"?
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Di 11.10.05 21:09
Hansi@OMG hat folgendes geschrieben: | So funktioniert das doch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); var zeit : tdate; begin idhttp1.Head(edit1.text); zeit:=idhttp1.Response.LastModified; label1.Caption:=datetostr(zeit); end; | |
Ja habe ich hier den Fehler vermutet! Also ich setze mit SetFileDate auf das Datum was ich ausgelesen habe
aber der ist einfach das aktuelle Datum, also wann die Datei heruntergeladen wurde!
FileStream := TFileStream.Create(FileName, fmCreate);
und lade mit
IdHTTP.Get(URL, FileStream);
FileStream.Free;
SetFileDate(FileName, IdHTTP.Response.LastModified); // die SetFileDate ist eine Funktion die ich mir wo kopiert habe und die benutzt FileSetDate aus SysUtils
Aber das Datum ist dennoch das Erzeugungsdatum! Ich möchte das das Datum gleich wie im Web der Datei gesetzt wird und
bei einer Änderung neu laden!
|
|
Hansi@OMG
      
Beiträge: 304
Vista
Delphi 2006 Prof., Lazarus
|
Verfasst: Mi 12.10.05 07:07
Ich weis nicht, ob Windows das zulässt. Außerdem ist soetwas zu Waage, es besteht einfach immer die Möglichkeit, dass jemand die Datei ändert. Deswegen würde ich dir Vorschlagen, die runtergeladen Bilder zu belassen und die Werte zugehörig zum Dateinamen in eine seperate Datei zu speichern.
_________________ Who doesn't know the Micrsoft developer "Mahatma Fatal Error"?
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Mi 12.10.05 08:05
Hansi@OMG hat folgendes geschrieben: | | Ich weis nicht, ob Windows das zulässt. Außerdem ist soetwas zu Waage, es besteht einfach immer die Möglichkeit, dass jemand die Datei ändert. Deswegen würde ich dir Vorschlagen, die runtergeladen Bilder zu belassen und die Werte zugehörig zum Dateinamen in eine seperate Datei zu speichern. |
Ah die Idee hate ich auch als ich die Worte las Windows läßt das nicht zu! Vielen Dank für Tip!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mi 12.10.05 08:45
Hansi@OMG hat folgendes geschrieben: | | Außerdem ist soetwas zu Waage |
du meinst wohl "vage"
@JRegier: SETFILETIME
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 14.10.05 06:47
retnyg hat folgendes geschrieben: | Hansi@OMG hat folgendes geschrieben: | | Außerdem ist soetwas zu Waage |
du meinst wohl "vage"
@JRegier: SETFILETIME |
Ich habe es jetzt so und der setzt mir ein Datum für das Jahr 2051
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| function TMainForm.FieldGetWebData(const URL: String): String; var HTTP : TIdHTTP; Mem : TFileStream; S : String; FE : Boolean; D : TDateTime; begin S := ApplicationDirectory+'Temp\'+ExtractFileNameFromURL(URL); FE := FileExists(S); HTTP := TIdHTTP.Create(Self); HTTP.Head(URL); D := HTTP.Response.LastModified; if(not FE) or ((FE) and (FileAge(S) <> DateTimeToFileDate(D)))then begin Mem := TFileStream.Create(S, fmCreate); HTTP.Get(URL, Mem); Mem.Free; SetFileTime(S, D); end; HTTP.Free; Result := S; end;
function DTimeToFTime(dTime: TDateTime): TFileTime; var t: Integer; ft: TFileTime; begin t:=DateTimeToFileDate(dTime); DosDateTimeToFileTime(LongRec(t).Hi, LongRec(t).Lo, ft); LocalFileTimeToFileTime(ft, Result); end;
procedure SetFileTime(FileName: String; dTime: TDateTime); var hFile: THandle; Creation, LastAcces, LastWrite: TFileTime; begin hFile:=CreateFile(PChar(FileName), Generic_Write, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Creation:=DTimeToFTime(dTime); LastAcces:=DTimeToFTime(dTime); LastWrite:=DTimeToFTime(dTime); Windows.SetFileTime(hFile, @Creation, @LastAcces, @LastWrite);
CloseHandle(hFile); end; |
Also ich wollte das halt wenn das gleiche Datum wie im Web das er nicht neu ladet! Aber der ladet noch immer
neu! Was mache ich nur falsch?
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 14.10.05 07:53
Ich habe nun mit einer anderen Procedur das Datum gesetzt! Aber habe nun doch immer das Datum 30. Dezember 1899 02:00:00 habe
also nach:
IdHTTP.Head(URL);
Date := IdHTTP.Response.LastModified;
ShowMessage(DateTimeToStr(Date));
gibt mir auch das Datum zurück!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| function SetFileDateTime(FileName: string; NewDateTime: TArrayDateTime; DateChanges : TDateChangeTypes): Boolean; var FileHandle: Integer; FileTime: TFileTime; LFT: TFileTime; LST: TSystemTime; I : TDateChangeType; begin Result := False; FileHandle:=-1; for I:= D_CREATE to D_WRITE do begin if(not (I in DateChanges))then Continue; try DecodeDate(NewDateTime[Ord(I)], LST.wYear, LST.wMonth, LST.wDay); DecodeTime(NewDateTime[Ord(I)], LST.wHour, LST.wMinute, LST.wSecond, LST.wMilliSeconds); if SystemTimeToFileTime(LST, LFT) then begin if LocalFileTimeToFileTime(LFT, FileTime) then begin FileHandle := FileOpen(FileName, fmOpenReadWrite or fmShareExclusive); case i of D_CREATE: if SetFileTime(FileHandle, @FileTime, nil, nil ) then Result := Result and True; D_ACCESS: if SetFileTime(FileHandle, nil, @FileTime, nil ) then Result := Result and True; D_WRITE : if SetFileTime(FileHandle, nil, nil, @FileTime ) then Result := Result and True; end; end; end; finally FileClose(FileHandle); end; end; end; |
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 14.10.05 08:17
Jetzt stellt sich noch ein Problem damit heraus! Wenn ich die SetFileDateTime procedure aufrufe kann das Bild danach nicht geöffnet
werden also ich prüfe mit FileExists ob Datei vorhanden wenn ja dann lade das aus dem Web heruntergeladene Bild!
Und der meldet False, obwohl ich FileClose in SetFileDateTime procedur aufrufe!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 14.10.05 13:03
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| program Project1; {$APPTYPE CONSOLE} uses windows,sysutils;
function _setFileDate(filename : string; time:Tdatetime): boolean; var hFile: tHandle; ttime: TFileTime; tsystime: TSystemTime; begin hFile := FileOpen(FileName, fmOpenWrite or fmShareDenyNone); if hFile <> INVALID_HANDLE_VALUE then begin DateTimeToSystemTime(time, tsystime); SystemTimeToFileTime(tsystime, ttime); setfiletime(hFile,@ttime, @ttime, @ttime); FileClose(hFile); result := true; end else result := false; end;
begin _setFileDate('C:\129.mp3', encodedate(1999,9,9)); end. |
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 14.10.05 20:31
Das mit dem Setzen des Dateidatums funktioniert ja!
Aber der Rückgabewert von der Indy Componente IdHTTP ist immer
von LastModified 30.12.1899 02:00:00 das ist das Problem!
Also nochmal:
Delphi-Quelltext 1: 2: 3:
| HTTP := TIdHTTP.Create(Self); HTTP.Head(URL); ShowMessage(DateTimeToStr(HTTP.Response.LastModified)); |
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Sa 15.10.05 03:37
JRegier hat folgendes geschrieben: | Das mit dem Setzen des Dateidatums funktioniert ja!
Aber der Rückgabewert von der Indy Componente IdHTTP ist immer
von LastModified 30.12.1899 02:00:00 das ist das Problem!
Also nochmal:
Delphi-Quelltext 1: 2: 3:
| HTTP := TIdHTTP.Create(Self); HTTP.Head(URL); ShowMessage(DateTimeToStr(HTTP.Response.LastModified)); | |
30.12.1899 02:00:00 = 0
es wird also kein wert von der indy kompo geliefert - pech gehabt
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Sa 15.10.05 08:06
retnyg hat folgendes geschrieben: |
30.12.1899 02:00:00 = 0
es wird also kein wert von der indy kompo geliefert - pech gehabt |
Ja ResponseText liefert mir: "200 OK" also da wahrscheinlich der Server die Daten nicht rausrückt!
Na gut dann müßte es doch andere Möglichkeit geben Bilder Up To Date halten?
Ich denke mal an Multitasking! Also wenn ich ein Task mit niedriger Priorität habe
wird der den weniger das Netzwerk auslasten als wenn der eine Normal Priorität
hat?
Wenn es hier kein unterschied gibt und es zu einem zu hohen Traffic führt so
das es stört dann müßte ich unter Optionen einstellungen haben wie
Mittagspause und ein Button jetzt Pause also lade Bilder neu,
(habe ich eingentlich ein Logof Button)
aber dann könnte wenn einer einen Volumentarif hat zu hohe Kosten entstehen!
Also dementsprechend Optionen zur Verfügung stellen: ein Bild neu laden z.B.
wenn er die Info bekommt Bilder wurden bearbeitet!
Man könnte es wie bei Opera machen Optionen nach X Tagen neu laden!
|
|
|