Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TWin32FindData.TFileTime nach TDateTime? (https://www.delphipraxis.net/940-twin32finddata-tfiletime-nach-tdatetime.html)

Sharky 29. Sep 2002 08:24


TWin32FindData.TFileTime nach TDateTime?
 
Hai ihr alle,

wie kann ich denn TFileTime von TWin32FindData in ein TDateTime wandeln?

Ich möchte mir für alle Dateien auf der HD die drei relevaten Datumswerte anzeigen lassen.

Gruss


Edit durch mich selber :-(

:oops:
Jetzt habe ich die deklaration im PSDK gefunden.

So geht es dann:

Code:
function FileTimeToDateTime (filetime : TFileTime): TDateTime;
var
 systime : TSystemTime;
 datetime : TDateTime;
begin
 FileTimeToSystemTime (filetime,systime);
 datetime := EncodeDate (systime.wYear,systime.wMonth,systime.wDay);
 datetime := datetime + EncodeTime (systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds);
 result := datetime;
end;
P.S.: Wie kann ich denn jetzt eigentlich den Code Formatiert im Forum darstellen?

Sharky 29. Sep 2002 09:22

Hai,

ich habe das ganze etwas geändert und vorallem die Abweichung zur UTC
berücksichtigt. Eventuell hat ja jemand das schon gesucht :-)

Code:
[b]uses[/b]
 IdGlobal;

[b]function[/b] FileTimeToDate (filetime : TFileTime): TDate;
[b]var[/b]
 systime : TSystemTime;
[b]begin[/b]
 FileTimeToSystemTime (filetime,systime);
 result := EncodeDate (systime.wYear,systime.wMonth,systime.wDay);
[b]end[/b];

[i]{****************************************************}[/i]

[b]function[/b] FileTimeToTime (filetime : TFileTime): TTime;
[b]var[/b]
 systime : TSystemTime;
[b]begin[/b]
 FileTimeToSystemTime (filetime,systime);
 result := OffsetFromUTC + EncodeTime (systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds);
[b]end[/b];

[i]{****************************************************}[/i]

[b]function[/b] FileTimeToDateTime (filetime : TFileTime): TDateTime;
[b]begin[/b]
 result := FileTimeToDate (filetime) + FileTimeToTime (filetime);
[b]end[/b];

theomega 29. Sep 2002 09:51

Erklärt mir mal einer was UTC ist?

Sharky 29. Sep 2002 10:22

Zitat:

Zitat von theomega
Erklärt mir mal einer was UTC ist?

UTC = coordinated universal time

das ist der "Nachfolger" vom GMT (Greenwich Mean Time).

Sprich: UTC = GMT = Uhrzeit in Greewich (bei London) = Uhrzeit beim Null-Meridian = Weltzeit

theomega 29. Sep 2002 10:28

gut, danke.

RomanK 29. Sep 2002 10:36

Aus dem PSDK:
Zitat:

System time is the current date and time of day. The system keeps time so that your applications have ready access to accurate time. The system bases system time on coordinated universal time (UTC). UTC-based time is loosely defined as the current date and time of day in Greenwich, England.

theomega 29. Sep 2002 10:40

bischen spät, aber trotzdem danke Roman.

Christian Seehase 29. Sep 2002 11:14

Moin Sharky,

aber denk' dran:
Wenn Du eine korrekte LastAccessTime haben willst, musst Du die, wohl oder übel mittels GetFileAttributesEx auslesen.
Machst Du das, z.B. mit FindFirst/FindNext und TSearchRec, so ist der Zeitpunkt des letzten Zugriffes der, an dem TSearchRec gefüllt wurde.
Ist so ähnlich, als würdest Du Dir die Eigentschaften über das Kontextmenü im Explorer ansehen. Da ist das Datum des letzten Zugriffes auch der Moment, in dem Du Dir die Eigenschaften anzeigen lässt.

Sharky 29. Sep 2002 13:40

Hai Christian,

danke für die Info. Das wuste ich nicht! Naja, aber da ich die Werte ja unmitelbar nach dem Find... abfrage reicht mir das.

Es geht in dem Programm darum zu ermitteln welche Dateien seit einem freiwählbarem Zeitraum nicht mehr benutzt wurden um mit einem Ausdruck dieser Liste den Usern im Netzwerk unter der Nase herum zu wedeln und sie darum zu "bitten" die Verzeichnisse auf dem Server mal wieder aufzuräumen :lol:

Christian Seehase 29. Sep 2002 13:48

Moin Sharky,

wenn ich das jetzt richtig verstanden habe, brauchst Du das also, um den Zeitpunkt des letzten Zugriffes zu ermitteln?
Und genau das geht mit FindFirst... schief.

Oder hab' ich Dich jetzt falsch verstanden?

Sharky 29. Sep 2002 13:51

Nö, Du hast mich richtig verstanden.

Was genau geht denn da schief? Bis jetzt habe ich das mit einen einfachen Test Code versucht und immer die richtigen werte (dachte ich bis jetzt) bekommen.

Kannst Du das Problem etwas genauer erläutern? Danke.

Christian Seehase 29. Sep 2002 14:11

Moin Sharky,

also bei mir war es bislang so, dass die über FindFirst... ermittelte LastAccessTime im TSearchRec immer dem Zeitpunkt entsprach, an dem ich das Programm habe laufen lassen, weil dieser Zugriff vom Programm vom Betriebbsystem als "Letzter Zugriff" gewertet wurde, was die Aussagekraft für diesen Wert natürlich auf null gesetzt hat.
Nur wenn ich den Pfad eine Datei angegeben hatte, und mir dann mit GetFileAttributesEx die Informationen über die Datei ausgelesen hatte stimmte der Wert.

Da Du ja sagst, das es bei Dir auch mit FindFirst... korrekt funktioniert, werde ich das aber gleich noch mal überprüfen.

Oben genanntes Verhalten hatte ich unter W2K SP1 bzw. SP2.

Sharky 29. Sep 2002 14:17

Hai Christian,

hier mal mein Stück TestCode:

Code:
[b]procedure[/b] TForm1.Button1Click(Sender: TObject);
[b]var[/b]
 sr                : TSearchRec;
 searchpath        : [b]string[/b];
[b]begin[/b]
 Memo1.Clear;
 searchpath := 'c:\testfiles\*.*';
 [b]if[/b] (FindFirst(searchpath, faAnyFile - faDirectory, sr) = 0) [b]then[/b]
  [b]begin[/b]
   Memo1.Lines.Add(sr.FindData.cFileName);
   Memo1.Lines.Add('Erstellungsdatum : ' + ' ' + DateTimeToStr(FileTimeToDateTime(sr.FindData.ftCreationTime)));
   Memo1.Lines.Add('letzte Änderung : ' + ' ' + DateTimeToStr(FileTimeToDateTime(sr.FindData.ftLastWriteTime)));
   Memo1.Lines.Add('letzter Zugriff : ' + ' ' + DateTimeToStr(FileTimeToDateTime(sr.FindData.ftLastAccessTime)));
   Memo1.Lines.Add('-----------------');
  [b]end[/b];
 [b]while[/b] FindNext(sr) = 0 [b]do[/b]
  [b]begin[/b]
   Memo1.Lines.Add(sr.FindData.cFileName);
   Memo1.Lines.Add('Erstellungsdatum : ' + ' ' + DateTimeToStr(FileTimeToDateTime(sr.FindData.ftCreationTime)));
   Memo1.Lines.Add('letzte Änderung : ' + ' ' + DateTimeToStr(FileTimeToDateTime(sr.FindData.ftLastWriteTime)));
   Memo1.Lines.Add('letzter Zugriff : ' + ' ' + DateTimeToStr(FileTimeToDateTime(sr.FindData.ftLastAccessTime)));
   Memo1.Lines.Add('-----------------');
  [b]end[/b];
 FindClose(sr);
[b]end[/b];
System:
Delphi 5 ent.
Windows 2000 SP1

Christian Seehase 29. Sep 2002 14:29

Moin Sharky,

bei mir sieht der Testcode so aus:

Code:
[b]procedure[/b] TForm1.Button1Click(Sender: TObject);

[b]var[/b]
  sRootDir : [b]string[/b];
  srWork  : TSearchRec;
  stWork  : TSystemTime;

[b]begin[/b]
  Memo1.Lines.Clear;
  sRootDir := GetPSDKIncludeDir;
  [b]if[/b] FindFirst(sRootDir+'\*.*',faAnyFile,srWork) = 0 [b]then[/b]
  [b]begin[/b]
    [b]try[/b]
      [b]repeat[/b]
        [b]if[/b] (srWork.Attr [b]and[/b] faDirectory) <> faDirectory [b]then[/b]
        [b]begin[/b]
          FileTimeToSystemTime(srWork.FindData.ftLastAccessTime,stWork);
          Memo1.Lines.Add(Format('%d.%d.%d %d:%d:%d',[stWork.wDay,stWork.wMonth,stWork.wYear,stWork.wHour,stWork.wMinute,stWork.wSecond]));
        [b]end[/b];
      [b]until[/b] FindNext(srWork) <> 0;
    [b]finally[/b]
      FindClose(srWork);
    [b]end[/b];
  [b]end[/b];
[b]end[/b];
und funktioniert (erstaunlicher Weise).
Jetzt muss ich direkt mal suchen, was ich das letzte Mal anders gemacht hatte. (falls ich des entsprechende Stückes Sourcecode noch habhaft werden kann ;-))

sakura 30. Apr 2004 10:44

Re: TWin32FindData.TFileTime nach TDateTime?
 
Hi Sharky,

gesucht, gefunden und FEHLER :!:

Durch den UTC-Shift kann sich auch das Datum ändern, dieses hast Du aber nicht berücksichtigt ;) Siehe auch mal nach MSDN-Library durchsuchenFileTimeToLocalFileTime

...:cat:...

kiar 30. Apr 2004 12:00

Re: TWin32FindData.TFileTime nach TDateTime?
 
hallo sakura,

könnte es sein das sich das problem in den letzten 1 1/2 jahren erledigt hat :mrgreen:

raik

sakura 30. Apr 2004 12:15

Re: TWin32FindData.TFileTime nach TDateTime?
 
Zitat:

Zitat von kiar
könnte es sein das sich das problem in den letzten 1 1/2 jahren erledigt hat :mrgreen:

Ja, aber kein Grund nach der Suche (und dem Treffer) nicht darauf hinzuweisen, oder :roll: Vielleicht sucht ja noch wer danach :shock:

...:cat:...

kiar 30. Apr 2004 12:20

Re: TWin32FindData.TFileTime nach TDateTime?
 
du hast explizit sharky angesprochen :wink:

aber ansonsten hast du natürlich recht

raik

Sharky 1. Mai 2004 07:37

Re: TWin32FindData.TFileTime nach TDateTime?
 
Zitat:

Zitat von sakura
..gesucht, gefunden und FEHLER :!:
Durch den UTC-Shift kann sich auch das Datum ändern, dieses hast Du aber nicht berücksichtigt...

Werden jetzt alle meine alten Beiträge wieder gefunden :?: *gg*

Uff... es ist noch zu früh für mich. Kannst Du das mal näher erklären? :stupid:


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