AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

Ein Thema von juergen · begonnen am 21. Apr 2011 · letzter Beitrag vom 29. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#1

Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 07:30
Delphi-Version: 2007
Guten Morgen,

für das setzen des MP3-Tag "Year" mit dem Datum der MP3-Datei nutze ich nachfolgende Funktion:
Delphi-Quellcode:
function GetFileDate(TheFileName: string): TDateTime;
var
  FHandle: integer;
begin
  FHandle := FileOpen(TheFileName, 0);
  try
    Result := FileDateToDateTime(FileGetDate(FHandle));
  finally
    FileClose(FHandle);
  end;
end;
Allerdings erscheint bei Dateien die älter als 01.01.1980 sind nachfolgende Fehlemeldung:
"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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 07:58
Mit FileAge solltest Du auch ein Datum < 1980 auslesen können

Delphi-Quellcode:
 
Result := FileDateToDateTime(FileAge(FileName));
Lars
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 08:11
Hallo daywalker9,

danke für deinen Antwort.
Die Verwendung von FileAge erzeugt leider dieselbe Fehlermeldung.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 08:11
Zitat:
Eine oder beide Delphi-Funktionen scheinen somit nicht einsetzbar, allerdings ist in der Delphi-Hilfe nichts dazu geschrieben.
Wenn man diese Funktionen mal getrennt untersucht, dann könnte man das "Eine von Beiden" eingrenzen.

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
Wie können denn im Windows Dateien existieren, welche älter als das OS sind, womit man sie erst erstellen konnte. Das Henne-Ei-Problem

PS: Ab Mitte 2159 wird es wieder Probleme geben.
$2B or not $2B

Geändert von himitsu (21. Apr 2011 um 08:15 Uhr)
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 08:37
PS: Ab Mitte 2159 wird es wieder Probleme geben.
Hab' mal im Kalender ein rotes X reingeschrieben.

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.

Geändert von Satty67 (21. Apr 2011 um 08:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 08:48
@himitsu,

danke für deine Erläuterungen.

Zitat von himitsu:
Wie können denn im Windows Dateien existieren, welche älter als das OS sind...
Z.B. kann man mit dem Total Commander das Dateidatum setzen.
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.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#7

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 08:49
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;
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#8

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 09:13
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
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 10:08
@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:
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;
@Blup,
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.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Fehler bei FileDateToDateTime(FileGetDate(FHandle)) wenn Dateidatum < 1980

  Alt 21. Apr 2011, 10:23
Gibt es im Delphi 2007 eigentlich schon die neue, überladene Version von Delphi-Referenz durchsuchenFileAge?

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
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 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