Delphi-Version: 2007
Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Guten Morgen,
für das setzen des MP3-Tag "Year" mit dem Datum der MP3-Datei nutze ich nachfolgende Funktion:
Delphi-Quellcode:
Allerdings erscheint bei Dateien die älter als 01.01.1980 sind nachfolgende Fehlemeldung:
function GetFileDate(TheFileName: string): TDateTime;
var FHandle: integer; begin FHandle := FileOpen(TheFileName, 0); try Result := FileDateToDateTime(FileGetDate(FHandle)); finally FileClose(FHandle); end; end; "Ungültiges Argument zum Codieren des Datums" Eine oder beide Delphi-Funktionen scheinen somit nicht einsetzbar, allerdings ist in der Delphi-Hilfe nichts dazu geschrieben. Gibt es hierfür eine Alternative? Danke schon mal vorab! |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Mit FileAge solltest Du auch ein Datum < 1980 auslesen können
Delphi-Quellcode:
Result := FileDateToDateTime(FileAge(FileName)); |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Hallo daywalker9,
danke für deinen Antwort. Die Verwendung von FileAge erzeugt leider dieselbe Fehlermeldung. |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Zitat:
PS: FileDate ist nunmal ein Wert Typ, der Datumswerte seit 1.1.1980 referenziert ... in der Definition sind dann eben keine negativen Werte vorgesehn, bzw. das ist ein Word und kein Integer :stupid: Wie können denn im Windows Dateien existieren, welche älter als das OS sind, womit man sie erst erstellen konnte. Das Henne-Ei-Problem :zwinker: PS: Ab Mitte 2159 wird es wieder Probleme geben. |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Zitat:
Wenn ich das richtig lese, dann gibt Windows auch den 1.1.1980 zurück, wenn die Datei nicht existiert (oder Handle ungültig). Also müsste es Ok sein, wenn man bei einer Exception (bei konvertieren in TDateTime) einfach TDateTime auf 0 und damit 1.1.1980 setzt. Wie himitsu ja geschrieben hat, wäre ein älteres Datei-Datum sowieso ein Datum, das es nicht geben kann. |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
@himitsu,
danke für deine Erläuterungen. Zitat:
Bei MP3-Dateien kommmt der Anwender schon mal auf die Idee das Filedatum auf das Erscheinungsjahr des Liedes zu setzen, da auch einige MP3-Player die Lieder sortiert nach Dateidatum anzeigen können. Ps.: ein kleiner Hinweis in der Hilfe wäre schon sinnvoll, zumindest für Anfänger wie mich, denen nicht auf Anhieb diese Thematik sofort klar ist. |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Ich benutze Windows.GetFileTime. Diese Funktion liefert eine Zeit ab 1601 mit einer Auflösung von 100ns. Allerdings muss man sich da zunächst einen ganzen Wald von Funktionen drum herum bauen, weil die Funktion zunächst mal die Zeit als UTC liefert. Die Zeit muss zunächst in die lokale Zeit umgerechnet werden. Danach kann man mit FiletimeToSystemTime die Zeit in ein brauchbares Format umwandeln. Systemtime ist ein Record welches Tag,Monat,Jahr usw. enthält. Damit kann man dann ganz gut weiterarbeiten.
Die Funktionen die bei Delphi benutzt werden, stammen noch aus DOS-Zeiten (bzw. sind dazu kompatibel) und sind schon seit Jahrzehnten veraltet.
Delphi-Quellcode:
var
FileAge: TFiletime; SystemTime: TSYSTEMTIME; begin GetFileTime(Handle, nil, nil, @FileAge); FileTimeToLocalFileTime(FileAge, FileAge); FiletimeToSystemTime(FileAge, SystemTime); EncodeDate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay); ... end; |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Code:
Format des Zeitstempels
Bit Inhalt ------------------- 00-04 Sekunde / 2 05-10 Minute 11-15 Stunde 16-20 Tag 21-24 Monat 25-31 Jahr seit 1980 |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
@samso,
danke für deine Erklärungen nebst Codebeispiel! Allerdings bekam ich mit deiner Funktion das Jahr 1899 heraus. Das Datum der Datei war in meinem Testfall der 01.01.1979. Ich habe es nun folgendermaßen gelöst:
Delphi-Quellcode:
@Blup,
function GetFileDate(TheFileName: string): TDateTime;
var SR: TSearchRec; SystemTime: TSystemTime; NewLastAccessTime: TFileTime; begin Result := 0; try if FindFirst(TheFileName, faAnyFile, SR) = 0 then try if (Windows.FileTimeToLocalFiletime(SR.FindData.ftLastWriteTime, NewLastAccessTime) and Windows.FileTimeToSystemTime(NewLastAccessTime, 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; danke für den Hinweis. Wenn in der Delphi-Hilfe bei der Funktionserklärung von FileAge() oder FileGetDate() jeweils dein Hinweis oder ein Verweis auf das Thema "Format Zeitstempel" stehen würde..., ja das wäre dann eine Hilfe. :stupid: |
AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Gibt es im Delphi 2007 eigentlich schon die neue, überladene Version von FileAge?
FileAge ist eine uralte Funktion, welche das Datum als DOSDateTime liefert Das format steht dann z.B. da http://msdn.microsoft.com/en-us/library/ms724274.aspx |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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