![]() |
Textdatei-Aktualisierungen über HTTP
Hallo zusammen.
Ich versuche gerade Text-Dateien von einem HTTP-Server per Last-Modified zu aktualisieren. Da dieses Update-Programm Zeitzonenunabhängig arbeiten soll muß ich was machen? Zur Vorgehensweise: 1. Last-Modified vom Server holen (UTC-Zeit) per php-Script. 2. Last-Modified der lokalen Datei holen (function FileLastModified oder mit FileAge). 3. Vergleich der beiden Werte und neues Datum setzen. Muß ich jetzt die Zeitdifferenz von LocalTime zu UTC addieren? Benutze ich FileAge oder FileLastModified? Und mit welchem Wert setze ich das Datum mit FileSetDate auf das neue LastModified-Datum? Ich habe dabei leider einen Blackout. Ansonsten ist das Programm bereits komplett fertig... Für eure Hilfe wäre ich echt dankbar! mfG JDommi Zur Info: ich benutze noch Delphi 7 und die Indy-Komponenten sind tabu, da sie unter Windows 7 Admin-Rechte benötigen (hat leider oder zum Glück nicht jeder User). Ich hole mir die Zeit mit folgendem php-Script vom Server:
Code:
Mit UnixTimeToDateTime konvertiere ich dieses Datum dann in TDateTime.
<?php
//Set no caching header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); $selfname = basename($_SERVER['PHP_SELF']); if ($handle = opendir('.')) { while (false !== ($file = readdir($handle))) { if ($file != $selfname && is_file($file)) { echo "$file\t" , filemtime($file) , "\n"; } } closedir($handle); } ?> Das Datum der letzten Änderung von der Datei auf Festplatte hole ich über:
Code:
Differenz zwischen UTC und Local Time
function FileLastModified(const sFile: string): TDateTime;
var h: THandle; Info1, Info2, Info3: TFileTime; SysTimeStruct: SYSTEMTIME; TimeZoneInfo: TTimeZoneInformation; begin Result := 0.0; h := FileOpen(sFile, fmOpenRead or fmShareDenyNone); if h > 0 then begin try GetFileTime(h, @Info1, @Info2, @Info3); if FileTimeToSystemTime(Info3, SysTimeStruct) then Result := SystemTimeToDateTime(SysTimeStruct); finally FileClose(h); end; end; end;
Code:
procedure GetTimeZoneBias;
const MINUTES_PER_DAY = 24.0 * 60.0; var tzi : TTimeZoneInformation; begin case GetTimeZoneInformation(tzi) of TIME_ZONE_ID_STANDARD: bias := (tzi.Bias) / MINUTES_PER_DAY; TIME_ZONE_ID_DAYLIGHT: // Sommerzeit bias := (tzi.Bias+tzi.DaylightBias) / MINUTES_PER_DAY; else bias := 0.0; end; end; |
AW: Textdatei-Aktualisierungen über HTTP
![]() ![]() ![]() ![]() Aber aufpassen, nicht alle Dateisysteme arbeiten gleich. Einige Speichern Datumsangaben in LocalTile (z.B. ältere FAT), andere als UTC (z.B. NTFS). Und dann arbeiten auch noch die Dateisystemtreiber anders. Einige könnten UTC-Angaben in LocalTime umwandeln und andere machen das nicht. Die Windows-Dateisystemtreiber machen sowas standardmäßig nicht. z.B. ![]() ![]() 1) Was natürlich nur funktioniert, wenn das Dateisystemals UTC speichert, ansonsten stimmt die Berechnung nicht. PS: Wenn als LocalTime gespeichert wurde, dann gibt es gewaltige Probleme, genauso gibt es einige Problemchen, wenn UTC nach LocalTime umgerechnet und damit denn weitergerechnet wird. Wie z.B. Zeitzonenwechsel, oder Sommerzeitumstellung, wo sich das selbe Datum anders auswirkt. |
AW: Textdatei-Aktualisierungen über HTTP
Das ist ja gerade mein Problem.
Ich habe die letzten beiden Wochen soviel versucht, aber irgendwie geht das bei manchen Systemen immer schief und ich weiß echt mittlerweile nicht mehr was ich wie machen soll... Mir schwirrt nur noch der Kopf vor lauter DateTime-Angaben *lol* Im Moment weiß ich nocht nicht mal mehr, ob und welche Datumsroutinen unter Delphi UTC oder LocalTime sind. Die Links von dir werde ich mir auf jeden Fall anschauen, aber ich befürchte, dass ich da trotzdem nicht zum Ziel kommen werde :( |
AW: Textdatei-Aktualisierungen über HTTP
Über die Dateizeit wirst du das nie sicher hinbekommen. Das ist dafür schlicht nicht gedacht.
Gibt es einen Grund dafür, dass du die benutzt? Warum benutzt du nicht einfach Hashwerte? Ein MD5 Hash z.B. lässt sich mit PHP und mit Delphi gleichermaßen leicht erstellen. Dann kannst du die einfach direkt vergleichen und damit hat sich das. Zitat:
Es gibt aber auch viele XP-User, die die PCs ordentlich eingerichtet haben, und dementsprechend auch dort keine Adminrechte haben, sondern als normale Benutzer arbeiten. Dort wird es dann vermutlich auch nicht gehen. Mit den Indy-Komponenten braucht man die aber AFAIK nur für das Pingen, da Microsoft das ohne Adminrechte nur über undokumentierte APIs hinbekommt und Indy die dokumentierten APIs benutzt. Wobei meinst du denn sonst, dass man die braucht? |
AW: Textdatei-Aktualisierungen über HTTP
Hi Jaenicke!
Mit Hash-Werten kenne ich mich leider nicht aus. Null Ahnung. Wie funktioniert das denn? Okay, kann ich natürlich auch erstmal nachlesen :wink: Aber bekomme ich damit nicht nur einen generellen Unterschied angezeigt? Da ich ca. 100 Texte mit jeweils unterschiedlichen Last-Modified Zeiten habe, muß ich sicherstellen, daß auch immer die aktuellste Version herauskommt. Mit den Adminrechten unter XP hast du natürlich Recht. Aber unter Win 7 finde ich das mit diesem UAC einfach nur sch... Ich habe bei mir Adminrechte und werde standardmäßig trotzdem gefragt, ob ich etwas zulassen will. Sicherheit hin oder her. Manche Sachen nerven einfach nur. Und für alles und jedes den Weg über den Taskplaner zu gehen ist auch ziemlich nervig. Zu Indy: Ich hatte die IdHTTPGet-Komponente nur auf meine Form gezogen, da hat das kompilierte Programm schon Adminrechte gefordert! War die Indy-Version 9.0.1.8 |
AW: Textdatei-Aktualisierungen über HTTP
Zitat:
Zitat:
Bei Indy gibt es dafür z.B. entsprechende Klassen. Mehr dazu findest du hier: ![]() |
AW: Textdatei-Aktualisierungen über HTTP
Stimmt, im Namen ist 'Update' mit drin. Ein Manifest war zwar mit eingebunden (getestet mit asInvoker bzw. requireAdmin) hat aber nichts gebracht. Entwedr musste ich wieder bestätigen oder das Programm lief erst gar nicht.
Das mit den Hash-Werten ist dann ja eigentlich unbrauchbar für mich. Da ich ja die einzelnen Dateien nicht auf Änderungen überprüfen darf, sondern auf ihr Alter. Ansonsten könnte ja eine aktuellere Textversion durch einen verspäteten Upload durch eine alte Datei ersetzt werden. Aber ich habe bereits eine andere Lösung parat :-D Ich liefere einfach eine Log-Datei mit, die die aktuellen Last-Mod-Werte beinhaltet und vergleiche diese mit der php-Variante. Diese Log-Datei wird natürlich nach jedem Check überschrieben. Da diese Daten immer die gleiche Zeitbasis haben, brauche ich mich um die lokalen Zeiten erst gar nicht zu kümmern! Nichts desto trotz Danke für die Hilfestellungen :thumb: |
AW: Textdatei-Aktualisierungen über HTTP
Zitat:
Zitat:
|
AW: Textdatei-Aktualisierungen über HTTP
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz