Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dateidatum auslesen liefert nur "Nullen" (https://www.delphipraxis.net/117289-dateidatum-auslesen-liefert-nur-nullen.html)

Tyler 15. Jul 2008 13:11


Dateidatum auslesen liefert nur "Nullen"
 
Hallo,

ich hab jetzt zwei verschiedene Methoden verwendet um das Datum von Dateien aus einem Netzwerkordner auszulesen. Die Dateien sind physisch vorhanden und zeigen in den Dateieigenschaften über den Explorer auch normale Informationen an.

Zur Fehlersuche verwende ich momentan folgendes:

Delphi-Quellcode:
    u := QuotedStr( q_FileLinkTemp.FieldByName('dirlink').AsString + q_FileLinkTemp.FieldByName('filelink').AsString );
    s := GetFileDate( u );
    try
        t := DateToStr( FileDateToDateTime( FileAge( u ) ) );
    except
      t := '0';
    end;
hier die GetFileData Funktion:
Delphi-Quellcode:

function Tf_main.GetFileDate(const aName:String):String;
var fh    :THandle;
    fdata :TWin32FindData;
    ft, wt :TFileTime;
    st    :TSystemTime;
begin
{  if FileExists(aName) then
  begin
    Result := FormatDateTime('yyyy-mm-dd', FileDateToDateTime(FileAge(aName)));
  end
  else
  begin
    Result := FormatDateTime('yyyy-mm-dd',MaxInt);
  end;
}
  Result:='';
  fh:=FindFirstFile(PChar(aName), fdata);
  if (fh<>Invalid_Handle_Value) then
  begin
    ft:=fdata.ftLastWriteTime;

    FileTimeToLocalFileTime(ft, wt);
    FileTimeToSystemTime(wt, st);
    with st do Result:=Format('%0.2d.%0.2d.%0.4d', [wDay, wMonth, wYear]);
  end; // If
  Windows.FindClose(fh);

end;
Als Ergebnis erhalte ich eben bei beiden Methoden 0 (aus dem TryExcept) oder "0000-00-00" (aus der Funktion). Und da es sich um knapp 400.000 Dateien handelt, die nicht "auslesbar" sind, kann ich einen Einzelfall ausschließen.


Danke euch!

marabu 15. Jul 2008 14:23

Re: Dateidatum auslesen liefert nur "Nullen"
 
Hallo,

deine Funktion GetFileDate() funktioniert bei mir, wenn ich den Fehler mit dem falsch platzierten FindClose() korrigiere - das muss in den Block rein, sonst gibt es Probleme im Fehlerfall.

Hier noch eine leicht abweichende Implementierung:

Delphi-Quellcode:
function FileModified(const fn: TFileName): TDateTime;
var
  sr: TSearchRec;
  tzi: TTimeZoneInformation;
  lt, st: TSystemTime;
begin
  if FindFirst(fn, faAnyFile, sr) = 0 then
  begin
    GetTimeZoneInformation(tzi);
    FileTimeToSystemTime(sr.FindData.ftLastWriteTime, st);
    SystemTimeToTzSpecificLocalTime(@tzi, st, lt);
    Result := SystemTimeToDateTime(lt);
    FindClose(sr);
  end else Result := 0;
end;
Lektüre zu FileAge() findest du hier: Alternative zu FileAge

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz