Entwickler-Ecke

Dateizugriff - Exe Erstellungszeit


Mathematiker - Fr 04.04.14 13:51
Titel: Exe Erstellungszeit
Hallo,
im "Info über"-Formular möchte ich den Tag und die Zeit anzeigen, bei der die Exe erstellt wurde.
Dazu nutze ich die hier in EE vorgestellte Funktion

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function GetCreationTimeOfFile(const AFileName: String): TDateTime;
var
   SR: TSearchRec;
   SystemTime: TSystemTime;
   NewCreationTime: TFileTime;
begin
   Result:=0;
   if FindFirst(AFileName, faAnyFile, SR)=0 then
   try
    IF (Windows.FileTimeToLocalFiletime(SR.FindData.ftCreationTime, NewCreationTime) and
            Windows.FileTimeToSystemTime(NewCreationTime, SystemTime)) Then
     Result:=Encodedate(SystemTime.wYear,
                        SystemTime.wMonth,
                        SystemTime.wDay) +
             Encodetime(SystemTime.wHour,
                        SystemTime.wMinute,
                        SystemTime.wSecond,
                        SystemTime.wMilliseconds);
   finally
    SysUtils.FindClose(SR)
   end;
end;

und rufe sie mit

Delphi-Quelltext
1:
datetimetostr(GetCreationTimeOfFile(application.exename))                    

auf.
Prinzipiell funktioniert es schon, allerdings habe ich einen merkwürdigen Effekt.
Compiliere ich die Exe, so erhalte ich mit dieser Funktion nicht jedes Mal die korrekte Zeit. Manchmal weicht der Wert um 20 min ab, manchmal nur um 10 min, ...
Ganz komisch ist: Eine erstellte Exe zeigt korrekt 3.4. 20.34 Uhr. Kopiere ich die Datei auf einen Stick und starte von dort, zeigt die Info mir auf einmal 31.3. als Datum an. Diese Datei vom Stick auf einen anderen Rechner kopiert, ergab heute früh als Anzeigedatum 4.4. :nixweiss:
Ich kann mir das nur so erklären, dass nicht der Zeitpunkt der Compilierung/Erstellung hier ausgewertet wird, sondern der Zeitpunkt, wann die Datei erstmals(?) in einen bestimmten Ordner kopiert wird.
Das erklärt aber den 31.3. auf dem Stick nicht und widerspricht auch einem Versuch, bei dem ich Exe einfach in einen anderen Ordner kopiert habe, ohne Änderung der Zeitanzeige.

Konkret benötige ich die korrekte Compilierzeit. Scheinbar geht das aber so nicht.
Weiß jemand Rat? Danke für Hinweise.

Beste Grüße
Mathematiker


Delete - Fr 04.04.14 17:30

Ich nutze immer FILEAGE:

Gibt den Zeitstempel des Betriebssystems für eine Datei zurück.
Mit FileAge ermitteln Sie den Zeitstempel des Betriebssystems der in FileName angegebenen Datei.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var Compiled : TDateTime; 
Version1, Author : string;
begin
FileAge(ParamStr(0), Compiled); 
Version1:= FormatDateTime('yyyymmdd', Compiled);
//Alternative:
Version1:= FormatDateTime('yyyymmdd - hhnnss', Compiled);

Author:=' XXXXXX  -  Author: HATHOR - Version: '+ Version1;
...


Um ÜBERFLÜSSIGEN Hinweisen zuvorzukommen:

Veraltet:
function FileAge(const FileName: string): Integer; overload;
Neu:
function FileAge(const FileName: string; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;


Mathematiker - Fr 04.04.14 18:02

Hallo,
Danke für die Hilfe.

Bei meinem alten Delphi 5 musste ich etwas anpassen

Delphi-Quelltext
1:
FormatDateTime('dd.mm.yyyy - hh:nn:ss', FileDateToDateTime(FileAge(ParamStr(0))));                    

und es funktioniert, wie gewünscht.

Beste Grüße
Mathematiker


Martok - Fr 04.04.14 19:00

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
und es funktioniert, wie gewünscht.
Ist aber trotzdem falsch ;)

CreationDate: Zeitpunkt, zu dem diese Datei an diesem Ort erstellt wurde. CreationDate ist auf FAT-Dateisystemen nicht (oder nur sehr granular) implementiert, deswegen kommt da u.U. was anderes raus als du glaubst, wenn das mal auf einem damit formatierten USB-Stick war.
ModifiedDate: Zeitpunkt des letzten FlushFile bzw. CloseFile (das kommt aus FileAge raus)
AccessDate: Letzer Zugriff allgemein, nur mit NTFS sinnvoll definiert, siehe MSDN dazu.

Nichts davon ist zwingend die Compilezeit ;)

In FPC gibt es dafür ein Pseudo-Include, welches zur Compilezeit als String aufgelöst wird.

Delphi-Quelltext
1:
const  build_date = {$INCLUDE %DATE%};                    


Delphi hat sowas nicht. Immer existent ist aber der Timestamp im PE-Header [http://msdn.microsoft.com/en-us/library/windows/desktop/ms680313%28v=vs.85%29.aspx]. Borland hat das damals aber aus unerfindlichen Gründen mit einer Magic Constant gefüllt, hat aber im Resourcensegment einen Timestamp gesetzt. Der ist zwar auch im falschen Format (DOS-Filetime in lokaler Zeit der Buildmaschine), aber solange man keine Zeitzonen wechselt geht das ganz gut. user profile iconLuckie hat da was für gebautgefunden [http://www.michael-puff.de/Programmierung/Delphi/Code-Snippets/GetImageLinkTimeStamp.shtml].


Mathematiker - Fr 04.04.14 19:17

Hallo,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ist aber trotzdem falsch ;)

Habe ich gemerkt. Bei einer Änderung des Dateidatums wird dieses dann angezeigt.
Ganz verstanden habe ich Deine Hinweise nicht, aber die Sache mit CreationDate ist mir verständlich. Deshalb gab es auch diese merkwürdigen Zeitangaben.

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconLuckie hat da was für gebaut [http://www.michael-puff.de/Programmierung/Delphi/Code-Snippets/GetImageLinkTimeStamp.shtml].

Das sieht sehr gut aus.
Ich habe es sofort ausprobiert, Zeit und Datum der Datei geändert und auch auf Stick kopiert.
Jetzt zeigt er tatsächlich die Compilezeit (richtig, nicht meine "Compilierzeit" :autsch: ) an.

Vielen Dank für die Hilfe.

Beste Grüße
Mathematiker


Delete - Sa 05.04.14 06:55

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconLuckie hat da was für gebaut [http://www.michael-puff.de/Programmierung/Delphi/Code-Snippets/GetImageLinkTimeStamp.shtml].


Nico Bendlin


Martok - Sa 05.04.14 21:22

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Nico Bendlin
Ah, ich hatte im Code nach einer Attribution gesucht, nicht da unten...