Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 04.04.14 13:51 
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
ausblenden 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
ausblenden 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
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.


ausblenden 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;

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 04.04.14 18:02 
Hallo,
Danke für die Hilfe.

Bei meinem alten Delphi 5 musste ich etwas anpassen
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
const  build_date = {$INCLUDE %DATE%};					


Delphi hat sowas nicht. Immer existent ist aber der Timestamp im PE-Header. 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."


Zuletzt bearbeitet von Martok am Sa 05.04.14 21:21, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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.

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
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.


Nico Bendlin
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."