Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit Dateialter und Zeitumstellung (https://www.delphipraxis.net/66246-problem-mit-dateialter-und-zeitumstellung.html)

Patrick 27. Mär 2006 10:42


Problem mit Dateialter und Zeitumstellung
 
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;

himitsu 27. Mär 2006 11:00

Re: Problem mit Dateialter und Zeitumstellung
 
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)

Patrick 27. Mär 2006 12:37

Re: Problem mit Dateialter und Zeitumstellung
 
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...

Christian Seehase 27. Mär 2006 14:14

Re: Problem mit Dateialter und Zeitumstellung
 
Moin Patrick,

das Problem dürfte sein, dass FileAge MSDN-Library durchsuchenFileTimeToLocalFileTime verwendet.

Patrick 28. Mär 2006 08:07

Re: Problem mit Dateialter und Zeitumstellung
 
Dann sollte ich wohl eine ander Funktion verwenden...
Hat jemand einen Vorschlag?

marabu 28. Mär 2006 09:32

Re: Problem mit Dateialter und Zeitumstellung
 
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

Corpsman 28. Mär 2006 10:17

Re: Problem mit Dateialter und Zeitumstellung
 
@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 ).

Patrick 28. Mär 2006 14:02

Re: Problem mit Dateialter und Zeitumstellung
 
@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?

Corpsman 28. Mär 2006 16:35

Re: Problem mit Dateialter und Zeitumstellung
 
@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 ;) .

Patrick 30. Mär 2006 12:06

Re: Problem mit Dateialter und Zeitumstellung
 
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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 Uhr.
Seite 1 von 2  1 2      

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