Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#1

Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?

  Alt 14. Sep 2023, 09:47
Hallo zusammen,

es geht mir um die einfache und sichere Bestimmung, ob ein Pfad mit Filenamen unter allen Plattformen definiert ist,
und damit das NOCH NICHT EXISTIERENDE File mit dem Pfad direkt erreichbar (schreibbar) wäre.
Es geht mir dabei momentan nur um den Pfad-Text und nicht um reale OS-Schreibrechte.

FileExists() scheidet da aus, weil das File ja noch NICHT existieren muss.

Also als Beispiele:
Delphi-Quellcode:
  LFilePath := 'C:\Dummy\Test001\Filename.txt'; //<== JA, absoluter Pfad ist valide
  LFilePath := '/private/var/mobile/Containers/Data/Application/97DD...A/tmp/Temporary.tmp'; //<== JA, absoluter Pfad ist valide
  LFilePath := '\Test001\Filename.txt'; //<== NEIN, der absoluter Pfad ist nicht valide beschreibbar ( ODER DOCH )
  LFilePath := '/Temporary.tmp'; //<== NEIN, der absolute Pfad ist nicht valide beschreibbar ( ODER DOCH )
  LFilePath := 'Filename.txt'; //<== NEIN, der absoluter Pfad ist nicht valide beschreibbar ( ODER DOCH )
  LFilePath := 'C:\Dummy\Test001\'; //<== NEIN, das ist kein Pfad mit Filename
  LFilePath := 'Dummy\Test001\Template.txt'; //<== NEIN, der absoluter Pfad ist nicht valide beschreibbar ( ODER DOCH )
Da spielt die Frage, ob absoluter oder relativer Pfad mit rein, also
- komplette, "absolute" Pfade sind nach meiner Definition IMMER valide beschreibbar,
- während relative Pfade valide sein können, meiner Meinung nach,
aber nicht zwingend valide sein müssen (wenn sie nicht in absolute Pfade aufgelöst werden können)

Es gibt dazu verschiedene Funktionen in System.SysUtils, System.IOUtils, z.B:
ExtractFilePath
ExtractFileName
ExpandFileName
TPath.GetFullPath
TPath.IsRelativePath
usw.


Mein bisheriger Favorit sieht sinngemäß so aus:
Delphi-Quellcode:
/ AFilePath - Enthält Path und Filename
function IsAbsoluteFilePathValid( const AFilePath ) : Boolean;
begin
    Result := False;

    if ExtractFilePath( TPath.GetFullPath( AFilePath ) ) <> 'then
    begin
         
        if ExtractFileName( AFilePath ) <> 'then
        begin
            //OK, the FilePath contains both FileDirectory and FileName parts (is therefor considered as valid )
            Result := True;
        end;

     end;
und schaut einfach, ob es Pfad-Anteil und File-Anteil im FilePath gibt.
Allerdings könnte der Pfad-Anteil relativ sein und damit NICHT immer in dem Sinne valide, wie ich mir das vorstelle.

Vielleicht reicht aber auch einfach ein ExpandFileName() aus, um die Pfad-Frage immer narrensicher aufzulösen.

Auch die Namensgebung ist diskutabel, statt
function IsAbsoluteFilePathValid( const AFilePath ) : Boolean; könnte auch
function IsFilePathWriteable( const AFilePath ) : Boolean; gut passen.

Ist aber etwas irreführend, weil es mir dabei momentan nicht um die Zugriffsrechte geht.
Also, ist das besser ?
function IsFilePathAccessible( const AFilePath ) : Boolean; Ich würde gerne das moderne System.IOUtils dafür nutzen, aber anscheinend kommt man um System.SysUtils nicht immer herum.

Wie seht ihr das, gibt es da überhaupt eine "optimale" Version, die alle Fälle abdeckt ?
  Mit Zitat antworten Zitat