AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit Dateialter und Zeitumstellung
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Dateialter und Zeitumstellung

Ein Thema von Patrick · begonnen am 27. Mär 2006 · letzter Beitrag vom 30. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

Problem mit Dateialter und Zeitumstellung

  Alt 27. Mär 2006, 10:42
Hallo,

Ich habe ein Programm geschreiben, was die Dateien zweier Ordner über das "Geändert am"-Datum miteinander vergleicht und die Änderungen gegebenenfalls ausgleicht. Vorteil beim Backup machen: Ich kopiere nicht mehr alles, sondern nur noch Neues.

Jetzt ergibt sich aber immer zur Zeitumstellung folgendes Problem:
Mein Programm meinte nun alle Dateien auf meinem Stick wären älter als die Dateien auf meiner Platte. Will der mich verarschen? Das "Geändert am"-Datum verändert sich doch durch die Zeitumstellung nicht. Ich habe eine Datei um 15:00 Uhr geändert. Das ist vor und nach der Zeitumstellung so, daran darf sich nichts ändern. Mein Computer nudelt doch nicht nach der Zeitumstellung alle Datei-Daten durch und ändert das Datum um ne Stunde...

Damit bestimme ich das "Geändert am"-Datum einer Datei
Delphi-Quellcode:
  function GetLastModified(const Datei: string; out Value: TDateTime): Boolean;
  var dt : Integer;
  begin
    dt := FileAge(Datei);
    Result := dt >= 0;
    if Result then Value := FileDateToDateTime(dt);
  end;
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Problem mit Dateialter und Zeitumstellung

  Alt 27. Mär 2006, 11:00
Das Datum im Dateisystem (also auf der Platte und dem USB-Stick) wird als GMT+0 abgespeichert, also ohne irgendwelche Zeitzonen- und Winter-/Sommerzeitinformationen.
Und ich vermute mal, daß bei einem der Datumsangaben, welche du ausließt diese "Zeitverschiebung" mit eingetrechnet wurde und beim anderem nicht, daher der Unterschied.

FileDateToDateTime(FileAge((...)) sollte den Wert als GMT+0 liefern (glaub ich), also könnte es daran liegen, daß das Dateim in dt incl. dieser Verschiebung vorliegt ... wie besorgst'n du dir dieses?


z.B. wurd bei den Dateumsangaben in TSearchResult (FindFirst/FindNext) die Zeitverschiebung des aktuell laufendem Systems schon beim uslesen mit zugerechnet.

Außerdem ist TDateTime ein ziehmlich ungenauer Datentyp, für solche Vergleiche ... der ist ja nur'n Double ... besser wöre es, wenn du die FileDate-Werte miteinander vergleichst, dat sind Integer und demnach etwas besser geeignet (abgesehn von den Rundungsfehlern beruhend auf'm Dateisystem)


PS: ich würde den Vergleich nicht nach dem Datum machen ... nich alle Dateisysteme besitzen die selbe Auflösung für's Datum, wobei es dann also zu Rundungsfehlern kommt ... hatte ich selber mal das Problem, obwohl Die Dateien das selbe datum haben sollten (da sie ja kopiert und somit "gleich" waren), gab es dennoch eine Differenz von bis zu 2 Sekunden (bei mir war'ns glaub'sch FAT16 und NTFS4).
Also entweder du vergleichst die Dateien direkt (Byte für Byte) oder per Hash (wobei man dort zur Sicherheit, bei gleichem Hash, auch nochmal Byte für Byte vergleichen sollte)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Problem mit Dateialter und Zeitumstellung

  Alt 27. Mär 2006, 12:37
Zitat:
FileDateToDateTime(FileAge((...)) sollte den Wert als GMT+0 liefern (glaub ich), also könnte es daran liegen, daß das Dateim in dt incl. dieser Verschiebung vorliegt ... wie besorgst'n du dir dieses?
Was "dieses"? Die Funktion "GetLastModified" ist doch in sich abgeschlossen. Ich gebe ihr die Datei als String und sie gibt mir das Datum.

Jetzt stellt sich mir halt die Frage, warum dieser Zeitfaktor auf die Dateien des Systems draufgerechnet wird, aber auf die Dateien meines Sticks nicht... Also mein Stick ist auf FAT formatiert, meine Platte aber auf NTFS... sch... Das sollte es sein.

Also an den "Byte für Byte"-Vergleich oder einen Hash-Vergleich habe ich auch schon gedacht, aber dann funktioniert das beidseitige Updaten nicht mehr. Das funktioniert bei Backups perfekt, aber nicht wenn ich zwei Ordner gegenseitig update...
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Problem mit Dateialter und Zeitumstellung

  Alt 27. Mär 2006, 14:14
Moin Patrick,

das Problem dürfte sein, dass FileAge MSDN-Library durchsuchenFileTimeToLocalFileTime verwendet.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Problem mit Dateialter und Zeitumstellung

  Alt 28. Mär 2006, 08:07
Dann sollte ich wohl eine ander Funktion verwenden...
Hat jemand einen Vorschlag?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Problem mit Dateialter und Zeitumstellung

  Alt 28. Mär 2006, 09:32
Hallo Patrick,

ich transferiere einen Teil meiner Arbeitsergebnisse per USB Festplatte zwischen meinem Büro- und Heimarbeitsplatz. Die Verzeichnisinhalte synchronisiere ich per XCOPY. Dieses Utility arbeitet nicht nach den Empfehlungen aus dem Hause Microsoft, aber für dich sollte das kein Problem sein:

Delphi-Quellcode:
function FileLastWritten(fn: TFileName): TDateTime;
var
  sr: TSearchRec;
  tzi: TTimeZoneInformation;
  lt, st: TSystemTime;
begin
  if FindFirst(fn, faAnyFile, sr) = 0 then
  begin
    GetTimeZoneInformation(tzi);
    FileTimeToSystemTime(sr.FindData.ftLastWriteTime, st);
    SystemTimeToTzSpecificLocalTime(@tzi, st, lt);
    Result := SystemTimeToDateTime(lt);
    FindClose(sr);
  end else Result := 0;
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Problem mit Dateialter und Zeitumstellung

  Alt 28. Mär 2006, 10:17
@patrick

Hi ich war schon lange am überlegen so was für mich auch zu Programmieren, Rückst du deine Version vielleicht raus und ich kann mir die Arbeit sparen ?

Das Prob ist nämlich das der TotalComander den ich dafür bis jetzt immer benutzt habe zwar wunderbar tut, nur leider ist nach jedem Update mein Kompletter arbeitsspeicher voll ( Das Proggy gibt da wohl nicht mehr ales Korreckt frei ).
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Problem mit Dateialter und Zeitumstellung

  Alt 28. Mär 2006, 14:02
@Marabu
Danke ich habe die Funktion ausgetauscht und werde es in Kürze testen!

@Corpsman
Was hättest du denn gerne, den Code oder nur das Programm?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Problem mit Dateialter und Zeitumstellung

  Alt 28. Mär 2006, 16:35
@Patrick

Nun ich gebe zu, der Code wäre mir lieber, so könnte ich Dinge die ich anders lösen würde wie du gleich ändern.

Allerdings habe ich durchaus verständniss wenn du mir den Source nicht geben möchtest.

Dann würde ich mich eben nur als Tester sehen und dich andauernd mit Verbesserungsvorschlägen bombadieren .
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Problem mit Dateialter und Zeitumstellung

  Alt 30. Mär 2006, 12:06
Also, so wie das jetzt aussieht muss ich meine Funktion verwenden. Wenn ich die Dateien kopiert habe gibt meine Funktion ruhe, die von Marabu aber meint sie müsste wieder kopieren.

@Corpsman
Dann gib mir mal Ratschläge: Link
Wenn du mir deine Vorschläge nicht gefallen, dann kannst du den Code haben...
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:22 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