AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Textdatei-Aktualisierungen über HTTP

Textdatei-Aktualisierungen über HTTP

Ein Thema von JDommi · begonnen am 12. Mai 2012 · letzter Beitrag vom 13. Mai 2012
Antwort Antwort
JDommi

Registriert seit: 20. Sep 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#1

Textdatei-Aktualisierungen über HTTP

  Alt 12. Mai 2012, 23:04
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:
<?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);
}
?>
Mit UnixTimeToDateTime konvertiere ich dieses Datum dann in TDateTime.
Das Datum der letzten Änderung von der Datei auf Festplatte hole ich über:
Code:
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;
Differenz zwischen UTC und Local Time
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#2

AW: Textdatei-Aktualisierungen über HTTP

  Alt 12. Mai 2012, 23:30
MSDN-Library durchsuchenGetTimeZoneInformation
MSDN-Library durchsuchenFileTimeToLocalFileTime
MSDN-Library durchsuchenLocalFileTimeToFileTime
MSDN-Library durchsuchenSystemTimeToTzSpecificLocalTime

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. Delphi-Referenz durchsuchenFindFirst *1 macht es, aber MSDN-Library durchsuchenFindFirstFile nicht.
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
JDommi

Registriert seit: 20. Sep 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Textdatei-Aktualisierungen über HTTP

  Alt 12. Mai 2012, 23:54
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Textdatei-Aktualisierungen über HTTP

  Alt 13. Mai 2012, 05:56
Ü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.

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).
Alles was unter Windows 7 Adminrechte benötigt, brauchte die auch schon unter XP. Der Unterschied ist nur, dass die meisten die dort einfach hatten.
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?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
JDommi

Registriert seit: 20. Sep 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Textdatei-Aktualisierungen über HTTP

  Alt 13. Mai 2012, 07:35
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
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Textdatei-Aktualisierungen über HTTP

  Alt 13. Mai 2012, 08:13
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
Dann hatte das Programm vermutlich "setup", "update" oder "patch" im Namen oder in den Versionsinformationen und kein Manifest eingebunden. Daraufhin fordert Windows 7 automatisch Adminrechte an, weil das für diese Programme in aller Regel notwendig ist.

Mit Hash-Werten kenne ich mich leider nicht aus. Null Ahnung. Wie funktioniert das denn? Okay, kann ich natürlich auch erstmal nachlesen
Aber bekomme ich damit nicht nur einen generellen Unterschied angezeigt?
Ein Hash ist eine Prüfsumme. Wenn die übereinstimmt, weißt du, dass die Datei mit sehr hoher Wahrscheinlichkeit dieselbe ist und umgekehrt. Dabei prüfst du dann tatsächlich den Dateiinhalt und nicht das nicht wirklich aussagekräftige (weil durch äußere Einflüsse veränderbare) Dateidatum.

Bei Indy gibt es dafür z.B. entsprechende Klassen. Mehr dazu findest du hier:
http://delphi.about.com/od/objectpas...i-md5-hash.htm
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
JDommi

Registriert seit: 20. Sep 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Textdatei-Aktualisierungen über HTTP

  Alt 13. Mai 2012, 09:08
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
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
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Textdatei-Aktualisierungen über HTTP

  Alt 13. Mai 2012, 11:00
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.
Wenn du im Manifest requireAdmin angibst ist es klar das die UAC aufgeht

Aber ich habe bereits eine andere Lösung parat
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!
Eine weitere Möglichkeit wäre eine einfache Textdatei mit dem Dateinamen (oder eine ID, Hash, etc.) der aktuellsten Textversion als Inhalt. Diese wird dann vom Programm geladen, ausgelesen und die Textversion nachgeladen.
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
JDommi

Registriert seit: 20. Sep 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Textdatei-Aktualisierungen über HTTP

  Alt 13. Mai 2012, 11:17
Zitat:
Wenn du im Manifest requireAdmin angibst ist es klar das die UAC aufgeht
Bei asInvoker ist das Prog erst gar nicht gestartet...


Zitat:
Eine weitere Möglichkeit wäre eine einfache Textdatei mit dem Dateinamen (oder eine ID, Hash, etc.) der aktuellsten Textversion als Inhalt. Diese wird dann vom Programm geladen, ausgelesen und die Textversion nachgeladen.
Genau so mache ich das jetzt ja auch. Nur halt mit dem Last-Mod-Wert aus php.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz