Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Timestap auslesen von einer datei funktioniert nicht (https://www.delphipraxis.net/91148-timestap-auslesen-von-einer-datei-funktioniert-nicht.html)

gsh 30. Apr 2007 12:44


Timestap auslesen von einer datei funktioniert nicht
 
Hi DPler

Hab mal wieder ein Problem für euch :wink:

Ich will den Timestap einer datei auslesen (aber nur den "Geändert am"). Dazu verwende ich folgende Funktion:
Delphi-Quellcode:
function GetFileLastModifiedTimeStap(const FileName: string) : TDateTime;
var
  FileHandle : THandle;
  DateInfo: TFileTime;
  SysTimeStruct: SYSTEMTIME;
  TimeZoneInfo: TTimeZoneInformation;
  Bias: Double;
begin
  Result := 2; //01.01.1900 00:00:00
  Bias := 0;
  FileHandle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
  if FileHandle > 0 then
  begin
    try
      if GetTimeZoneInformation(TimeZoneInfo) <> $FFFFFFFF then Bias := TimeZoneInfo.Bias / 1440; // 60x24
      GetFileTime(FileHandle, nil, nil, @DateInfo);
      if FileTimeToSystemTime(DateInfo, SysTimeStruct) then result := SystemTimeToDateTime(SysTimeStruct) - Bias;
    finally
      FileClose(FileHandle);
    end;
  end;
end;
So diese Funktion funktioniert eigentlich ganz gut. Bis auf des das eine Stunde fehlt. D.h. das programm sagt 12:42:00 meine systemuhr aber 13:42:00
natürlich könnte ich jetzt einfach eine stunde dazu zählen nur weiß ich nicht wie sich des auf anderen System (mit anderen Zeitzonen ...) auswirkt

CCRDude 30. Apr 2007 12:46

Re: Timestap auslesen von einer datei funktioniert nicht
 
Wofür steht denn dein $FFFFFFFF? (sehs gerade, TIME_ZONE_ID_INVALID...)
Als Rückgabewert für GetTimeZoneInformation kenn ich da noch TIME_ZONE_ID_DAYLIGHT, was für eine Stunde Versatz sprechen würde ;) Werte das Rückgabeergebnis mal genauer aus, dann klappts auch mit der Sommerzeit.

gsh 30. Apr 2007 12:50

Re: Timestap auslesen von einer datei funktioniert nicht
 
Zitat:

Zitat von CCRDude
Als Rückgabewert für GetTimeZoneInformation kenn ich da noch TIME_ZONE_ID_DAYLIGHT, was für eine Stunde Versatz sprechen würde ;) Werte das Rückgabeergebnis mal genauer aus, dann klappts auch mit der Sommerzeit.

ahm ja ... und wie mach ich des?
ah stimmt an der sommerzeit kann es liegen

CCRDude 30. Apr 2007 12:53

Re: Timestap auslesen von einer datei funktioniert nicht
 
Wie, wie machst Du das? :D

Jetzt nur mal grob auswendig umgewandelt:

Delphi-Quellcode:
cTZI := GetTimeZoneInformation(TimeZoneInfo);
if cTZI <> $FFFFFFFF
 then Bias := TimeZoneInfo.Bias / 1440;
if cTZI = TIME_ZONE_ID_DAYLIGHT
 then Inc(Bias, 60);
Kann auch Dec statt Inc sein, bin zu faul jetzt nachzudenken, wierum Du da verschiebst ;)

gsh 30. Apr 2007 13:04

Re: Timestap auslesen von einer datei funktioniert nicht
 
k danke

super danke es funktioniert jetzt:
Delphi-Quellcode:
function GetFileLastModifiedTimeStap(const FileName: string) : TDateTime;
var
  FileHandle : THandle;
  DateInfo: TFileTime;
  SysTimeStruct: SYSTEMTIME;
  TimeZoneInfo: TTimeZoneInformation;
  Bias: Double;
begin
  Result := 2; //01.01.1900 00:00:00
  FileHandle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
  if FileHandle > 0 then
  begin
    try
      if GetTimeZoneInformation(TimeZoneInfo) <> $FFFFFFFF then
      begin
        Bias := TimeZoneInfo.Bias / 1440; // 60x24
        if GetTimeZoneInformation(TimeZoneInfo) = TIME_ZONE_ID_DAYLIGHT then Bias := Bias - (60 / 1440);
        GetFileTime(FileHandle, nil, nil, @DateInfo);
        if FileTimeToSystemTime(DateInfo, SysTimeStruct) then result := SystemTimeToDateTime(SysTimeStruct) - Bias;
      end;
    finally
      FileClose(FileHandle);
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 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