Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Nochmal FileAge (https://www.delphipraxis.net/205974-nochmal-fileage.html)

Willie1 5. Nov 2020 18:45

Delphi-Version: 10.1 Berlin

Nochmal FileAge
 
Hallo Leute,
ich weiß, dass war hier schon Thema.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  dt: TDateTime;
  s: string;
begin
  if ofd.Execute then begin
    FileAge(ofd.FileName, dt);
//    dt:= FileDateToDateTime(FileAge(ofd.FileName));
    DateTimeToString(s,'dd/mm/yyyy hh/mm/ss',dt);
    label1.Caption := s;
  end;
end;
Wie zu sehen ist, unterscheidet sich die überladene Version auch im Rückgabewert!

Jetzt meine Frage: ich habe oft die alte Version benutzt, die der Compiler als "veraltet" bezeichnet. Sollte oder muss ich das ändern, weil das "alte" FileAge in Zukunft vielleicht wegfällt.

Gruß Willie.

himitsu 5. Nov 2020 18:54

AW: Nochmal FileAge
 
Abgesehn davon dass der "Integer" der alten Version ein paar "unglückliche" Beschränkungen hat, kannst das Alte natürlich noch so lange benutzen, wie es noch nicht rausgeflogen ist (und Delphi ist sehr langsam, mit sowas wie Altes raus oder Neues rein)
Oder wie wäre es mit den Dateidatumsfunktionen aus Delphi-Referenz durchsuchenTFile?

Du kannst dir natürlich auch ein eigenes FileAge bauen, was TDataTime als Result hat und dass intern die neue Version von Delphi-Referenz durchsuchenFileAge aufruft/kapselt.
Und dann bauchst nur noch FileDateToDateTime(FileAge durch deine neue Version zu ersetzen.





ABER was du unbedingt tuen solltest, ist das "Result" des neuen FileAge prüfen, denn ist das False, dann ist der Datumswert undefiniert (per Definition ungültig/zufällig oder sonstwas).
z.B. bei IF NOT das Datum auf einen Standardwert ala 0 setzen oder eine Exception werfen.



PS: Mit FormatDateTime gibt es hier ebenfalls eine Variante direkt mit Sting als Result.

Willie1 6. Nov 2020 16:59

AW: Nochmal FileAge
 
Hallo Himitsu,
ich will die vielen Warnungen ernst nehmen und werde mir ein neue function FileAge bauen mit Rückgabewert TDateTime. Da kann ich den Quelltext einfacher anpassen.
Noch 'ne Frage: was kann denn beim Auslesen des File-Datum schief gehen, klar die Datei muss vorhanden sein, aber was denn sonst?
Ich habe es ausprobiert, bei falschem Dateinamen gibt das neue FileAge false und FileDateTime = 0 zurück, das finde ich in Ordnung.
Kann ich das so machen?
function FileAge(const fn: TFilename): TDateTime; overload;
begin
if not FileAge(fn, Result) then Result := 0;
end;

Willie.

himitsu 6. Nov 2020 18:37

AW: Nochmal FileAge
 
Joar, Datei vorhanden,
Verzeichnis richtig,
Pfad eventuell zu lang
ungültige Zeichen,
fehlende Rechte (Verzeichnis lesen dürfen),

und ein ungültiges Datum (ist zwar selten, aber kann auch mal passieren, z.B. nach Hardware-/Softwaredefekt, Virenbefall oder Stromausfall)

Zitat:

Delphi-Quellcode:
function FileAge(const fn: TFilename): TDateTime; overload

Hier hast du ein Problemchen, den Signaturen müssen/sollten eindeutig sein.

Hast du irgendwo mal die DateUtils nach deiner Unit in den Uses, in der dein FileAge deklatiert ist, dann wird das falsche FileAge verwendet.
Und da Integer sich an TDateTime zuweisen lässt (andersrum würde es knallten Float-zu-Integer) gäbe der Compiler keine Warung, wenn er statt deiner Funktion das uralte Original nimmt.

Unterschiedliche Parameter (alles was ohne DEFAULT ist) oder ein anderer Name, damit es eindeutig zugeordnet werden kann.

Willie1 7. Nov 2020 18:03

AW: Nochmal FileAge
 
Zitat:

Zitat von himitsu (Beitrag 1476834)
Hier hast du ein Problemchen, den Signaturen müssen/sollten eindeutig sein.

Ok, das verstehe ich, werde es File_Age nennen. Ich muss mir ja sowieso jedes Vorkommen im Quelltext ansehen. Ich hatte vorgehabt es MyUnit.FileAge zu nennen, aber deine Argumentation überzeugt mich.
Willie.

himitsu 7. Nov 2020 22:57

AW: Nochmal FileAge
 
Wenn du es überall mit Namespace verwendest, dann wäre es auch eindeutig. (nur einmal ohne Namespace/Unitname verwendet ... kann schief gehn)

[add]
TFile.GetCreationTime(const Path: string): TDateTime;
TFile.GetCreationTimeUtc(const Path: string): TDateTime;
TFile.GetLastAccessTime(const Path: string): TDateTime;
TFile.GetLastAccessTimeUtc(const Path: string): TDateTime;
Delphi-Referenz durchsuchenTFile.GetLastWriteTime(const Path: string): TDateTime;
TFile.GetLastWriteTimeUtc(const Path: string): TDateTime;

Willie1 8. Nov 2020 16:13

AW: Nochmal FileAge
 
Jetzt will ich es wissen:
Delphi-Quellcode:
function FileAge(const fn: TFilename): TDateTime; overload;
begin
  if not FileAge(fn, Result) then Result := 0;
end;

function File_Age(const fn: TFilename): TDateTime;
begin
  try
    Result := TFile.GetCreationTime(fn);
  except
    Result := 0;  //jeder Fehler wird auf 0 gesetzt!
  end;
end;
Bei der zweiten Methode muss ich IOUtils einbinden.
Sind die beiden Methoden jetzt gleichwertig? W.

Willie1 9. Nov 2020 16:27

AW: Nochmal FileAge
 
Hallo Himitsu,
danke für deine Geduld.
Willie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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