AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nochmal FileAge

Ein Thema von Willie1 · begonnen am 5. Nov 2020 · letzter Beitrag vom 9. Nov 2020
Antwort Antwort
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Nochmal FileAge

  Alt 5. Nov 2020, 19:45
Delphi-Version: 10.1 Berlin
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Nochmal FileAge

  Alt 5. Nov 2020, 19:54
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.
$2B or not $2B

Geändert von himitsu ( 5. Nov 2020 um 19:58 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: Nochmal FileAge

  Alt 6. Nov 2020, 17:59
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 ( 6. Nov 2020 um 18:17 Uhr) Grund: Quelltext
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Nochmal FileAge

  Alt 6. Nov 2020, 19:37
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:
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.
$2B or not $2B

Geändert von himitsu ( 6. Nov 2020 um 20:16 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: Nochmal FileAge

  Alt 7. Nov 2020, 19:03
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Nochmal FileAge

  Alt 7. Nov 2020, 23:57
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;
$2B or not $2B

Geändert von himitsu ( 8. Nov 2020 um 00:18 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Nochmal FileAge

  Alt 8. Nov 2020, 17:13
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Nochmal FileAge

  Alt 9. Nov 2020, 17:27
Hallo Himitsu,
danke für deine Geduld.
Willie.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 18:38 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