Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Erstellungsdatum der Exe rausbekommen ?

21 views
Skip to first unread message

Andreas Kammann

unread,
Jan 31, 2007, 11:48:56 AM1/31/07
to
Hallo mit welchen Methoden bekomme ich das Erstellungsdatum einer Exe raus.
Also das Datum an dem die Exe erstellt wurde. Wenn ich z.b. die Exe irgendwo
anders hinkopiere ändert sich ja immer das geändert am Datum.
Ich benötige das Erstelldatum.
Gruss


Karsten Sosna

unread,
Jan 31, 2007, 12:47:48 PM1/31/07
to

Siehe FileInfo-Class(CreationTime, LastAccessTime, LastWriteTime)
--
Gruß Scotty


Andreas Kammann

unread,
Jan 31, 2007, 1:53:49 PM1/31/07
to
Hallo, bei meiner Exe von meiner Applikation habe ich folgendes.
Erstellt 25.01.2007
Geändert am 31.01.2007
letzter Zugriff 31.01.2007

Ich habe aber jetzt gerade meine Exe neu erstellt ! (neu erstellen unter
Visual Studio)
habe aber noch immer in Erstellt 25.01.2007 drin. :(

Oder wird dies Datum nur geändert wenn man ein neues Setup erstellt ?
Gruss

"Karsten Sosna" <k.sosna-...@t-online.de> schrieb im Newsbeitrag
news:%23ZRRp$VRHHA...@TK2MSFTNGP02.phx.gbl...

Stefan Falz

unread,
Jan 31, 2007, 4:13:02 PM1/31/07
to
Hallo Andreas,

"Andreas Kammann" schrieb:

> Hallo, bei meiner Exe von meiner Applikation habe ich folgendes.
> Erstellt 25.01.2007
> Geändert am 31.01.2007
> letzter Zugriff 31.01.2007
>
> Ich habe aber jetzt gerade meine Exe neu erstellt ! (neu erstellen unter
> Visual Studio)
> habe aber noch immer in Erstellt 25.01.2007 drin. :(
>
> Oder wird dies Datum nur geändert wenn man ein neues Setup erstellt ?

Probier mal folgendes: Lösch die Exe Datei und erstell sie dann innerhalb
von wenigen Sekunden neu. Dann schaust du mal auf das Erstellungsdatum.
Dasselbe machst du dann nochmal, lässt aber ein paar Minuten vergehen.

Um noch einen draufzulegen, such dir mal eine alte Datei, die du nicht
mehr brauchst. Löschen und einfach eine neue Textdatei mit dem Namen
und der Dateierweiterung der alten Datei erstellen (innerhalb weniger
Sekunden)

Was ich damit sagen will: Auf das Erstellungsdatum darfst du dich nicht
verlassen.

--
Tschau, Stefan
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Thorsten Doerfler

unread,
Jan 31, 2007, 5:28:47 PM1/31/07
to
Andreas Kammann schrieb:

Der Compiler speichert beim Erstellen den Zeitstempel im PE-Header der
erstellten EXE/DLL. Anbei ein Beispiel, wie Du diesen auslesen kannst:

' -- PEBuildDate.vb --
' Konsolenanwendung 'pebuildate.exe'
Option Strict On

Imports System.IO

' PEBuildDate Beispielanwendung
' Gibt die eigene Version und das Erstellungsdatum aus.
' Wird als Argument der Pfad zu einer gültigen PE-Datei (EXE/DLL)
' angegeben, wird deren Erstellungsdatum ebenso angezeigt:
Module Module1
Sub Main()
Dim lArgs() As String = Environment.GetCommandLineArgs()
Dim lVersion As Version = _
System.Reflection.Assembly.GetExecutingAssembly.GetName().Version

Console.WriteLine("PE BuildDate " & lVersion.ToString(4))
Console.WriteLine("Erstellt am: " & _
BuildInfo.PEBuildDate().ToString & _
ControlChars.NewLine)

If lArgs.Length > 1 Then
Console.WriteLine(Path.GetFileName(lArgs(1)))

Try
Console.WriteLine("wurde erstellt am: " & _
BuildInfo.PEBuildDate(lArgs(1)).ToString)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try

Exit Sub
End If

Console.WriteLine("Anwendung:{0}{0} pebuildate Dateiname", _
ControlChars.NewLine)
End Sub

End Module

Friend Class BuildInfo
Public Shared Function PEBuildDate() As Date
Return PEBuildDate(System.Reflection.Assembly.GetExecutingAssembly)
End Function

Public Shared Function PEBuildDate( _
ByVal [assembly] As System.Reflection.Assembly _
) As Date
Return PEBuildDate([assembly].Location)
End Function

Public Shared Function PEBuildDate( _
ByVal filename As String _
) As Date
Dim lPEOffset As Integer
Dim lPE() As Char
Dim lTimeStamp As Integer
Dim lDate As New Date(1970, 1, 1)

Const PE_OFFSET As Integer = &H3C
Const PE_TIMESTAMP As Integer = 8
Const PE_SIGNATURE As String = "PE" & _
ControlChars.NullChar & _
ControlChars.NullChar

If Not System.IO.File.Exists(filename) Then
Throw New FileNotFoundException
End If

Dim lStream As Stream = File.Open(filename, _
FileMode.Open, _
FileAccess.Read)
Dim lReader As New BinaryReader(lStream)

lReader.BaseStream.Seek(PE_OFFSET, SeekOrigin.Begin)
lPEOffset = lReader.ReadInt32()
lReader.BaseStream.Seek(lPEOffset, SeekOrigin.Begin)
lPE = lReader.ReadChars(PE_SIGNATURE.Length)

If Not String.Equals(lPE, PE_SIGNATURE) Then
lReader.Close()
Throw New InvalidPEFileException
End If

lReader.BaseStream.Seek(lPEOffset + PE_TIMESTAMP, _
SeekOrigin.Begin)
lTimeStamp = lReader.ReadInt32()
lReader.Close()

Return lDate.AddSeconds(lTimeStamp).ToLocalTime
End Function
End Class

Friend Class InvalidPEFileException
Inherits System.Exception

Public Sub New()
MyBase.New("Die Datei ist keine gültige PE-Datei.")
End Sub
End Class
' --

Thorsten Dörfler
--
vb-hellfire - einfach anders
http://www.vb-hellfire.de/

Kerem Gümrükcü

unread,
Jan 31, 2007, 10:28:29 PM1/31/07
to
"Thorsten Doerfler" <t.doerfl...@bdsw.de> schrieb im Newsbeitrag
news:epr8n0...@news.bdsw.de...

Hallo Thorsten,

gefällt mir deine Lösung...was wären wir ohne die PE Spezifikation,
was..!?!?
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx


Beste Grüße

Kerem Gümrükcü

Andreas Kammann

unread,
Feb 4, 2007, 11:31:58 AM2/4/07
to
Hallo Thorsten,
ich habe jetzt mal deinen Source eingebaut und bekomme bei

Dim lStream As Stream = File.Open(filename, _
FileMode.Open, _
FileAccess.Read)
Dim lReader As New BinaryReader(lStream)


immer einen Fehler, Der Prozess kann nicht auf die Datei ... zugreifen, da
sie von einem anderen Prozess verwendet wird.
Gruss


Martin H.

unread,
Feb 8, 2007, 2:43:29 PM2/8/07
to
Hallo Andreas,

folgender Code gibt Dir genau das zurück, was Du willst - ohne

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MyPath As String =
System.Reflection.Assembly.GetExecutingAssembly.Location()
MsgBox(CreatedOn(MyPath).ToString)
End Sub

Private Function CreatedOn(ByVal Exe As String) As Date
Return New System.IO.FileInfo(Exe).CreationTime
End Function


Beste Grüße,

Martin

Thorsten Doerfler

unread,
Feb 8, 2007, 4:49:40 PM2/8/07
to
Martin H. schrieb:

> folgender Code gibt Dir genau das zurück, was Du willst - ohne
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles Button1.Click
> Dim MyPath As String =
> System.Reflection.Assembly.GetExecutingAssembly.Location()
> MsgBox(CreatedOn(MyPath).ToString)
> End Sub
>
> Private Function CreatedOn(ByVal Exe As String) As Date
> Return New System.IO.FileInfo(Exe).CreationTime
> End Function

Das Erstellungsdatum gibt in dem Fall nur den Zeitpunkt der
erstmaligen Erstellung an. Bei weiteren Build-Aktionen wird dieses
Datum nicht mehr angerührt, es sei denn man löscht zuvor die
Ausgabedateien.

Martin H.

unread,
Feb 8, 2007, 5:31:03 PM2/8/07
to
Hallo Thorsten,

> Das Erstellungsdatum gibt in dem Fall nur den Zeitpunkt der
> erstmaligen Erstellung an. Bei weiteren Build-Aktionen wird dieses
> Datum nicht mehr angerührt, es sei denn man löscht zuvor die
> Ausgabedateien.

das ist schon klar. Hatte der OP ja auch in seinem Posting klargemacht.


Beste Grüße,

Martin

0 new messages