AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?
Thema durchsuchen
Ansicht
Themen-Optionen

Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?

Ein Thema von Rollo62 · begonnen am 14. Sep 2023 · letzter Beitrag vom 14. Sep 2023
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.093 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
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?

  Alt 14. Sep 2023, 10:02
Was spricht denn gegen TDirectory.Exists oder (als Old School) auch DirectoryExists ? Kannst du Fälle wo das nicht funktioniert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#3

AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?

  Alt 14. Sep 2023, 12:44
Hallo Uwe,

mir geht es drum, das möglichst erstmal rein am Text des FilePaths auszumachen,
ohne Seiteneffekte und sonstige "Magie", wie zum Beispiel OS-spezifische Funktionen wie "GetFullPathName" von Windows.

DirectoryExists kann doch Einiges nebenbei machen, was potentiell ungewünscht ist.

Delphi-Quellcode:
....
 if FollowLink then
    begin
      Handle := CreateFile(PChar(Directory), GENERIC_READ, FILE_SHARE_READ, nil,
        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
      if Handle <> INVALID_HANDLE_VALUE then
      begin
        CloseHandle(Handle);
        Result := faDirectory and Code <> 0;
      end;
    end
...

Es muss doch eine universelle, platformunabhängige Methode geben, um einen FilePath-Text vorab auf generelle Validität auszuwerten.
Dazu gibt es ja die Prüfungen auf korrekte Characters, Delimiter und so weiter, aber irgendwie keine logische Prüfung.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#4

AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?

  Alt 14. Sep 2023, 16:58
mir geht es drum, das möglichst erstmal rein am Text des FilePaths auszumachen,
ohne Seiteneffekte und sonstige "Magie", wie zum Beispiel OS-spezifische Funktionen wie "GetFullPathName" von Windows.
So richtig habe ich deine Anforderungen nicht verstanden, vielleicht so:
Delphi-Quellcode:
type
  TFileNameValidation = (fnvDirName, fnvFileName);
  TFileNameValidations = set of TFileNameValidation;

function CheckFileName(const pmcFileName: TFileName; pmValidationParts: TFileNameValidations; pmCheckedFileName: PFileName = Nil): Boolean;
var
  dirName, fileName: TFileName;
begin
  if (pmcFileName = '') or (pmValidationParts = []) then Exit(False); //=>

  Result := True;
  try
    if fnvDirName in pmValidationParts then
    begin
      dirName := TPath.GetDirectoryName(pmcFileName);
      Result := ((dirName <> '') and TPath.IsPathRooted(dirName));
    end;

    if Result
      and (fnvFileName in pmValidationParts) then
    begin
      fileName := TPath.GetFileName(pmcFileName);
      Result := ((fileName <> '') and TPath.HasValidFileNameChars(fileName, False));
    end;

    if Result
      and (pmCheckedFileName <> Nil) then
    begin
      if (dirName <> '') and (fileName <> '') then
        pmCheckedFileName^ := TPath.Combine(dirName, fileName, False)
      else if fileName <> 'then
        pmCheckedFileName^ := fileName
      else
        pmCheckedFileName^ := dirName;
    end;
  except
    Result := False;
  end;
end;

var
  fileName: TFileName;
begin
  fileName := 'C:\Dummy\Test001\Filename.txt';
  // fileName := '/private/var/mobile/Containers/Data/Application/97DD...A/tmp/Temporary.tmp';
  // fileName := '\Test001\Filename.txt';
  // fileName := '/Temporary.tmp';
  // fileName := 'Filename.txt';
  // fileName := 'C:\Dummy\Test001\';
  // fileName := 'Dummy\Test001\Template.txt';

  if CheckFileName(fileName, [fnvDirName, fnvFileName], @fileName) then
    ShowMessage(fileName);
Bis bald...
Thomas
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#5

AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?

  Alt 14. Sep 2023, 17:37
So richtig habe ich deine Anforderungen nicht verstanden, vielleicht so: [DELPHI]
Danke sehr für die Vorschlag, aber ich möchte mich eben möglichst nicht um die einzelne Elemente selber kümmern.

Ich bekomme irgendeinen FilePath als Text-String rein, der kann absolut, relativ, oder auch nur ein reiner "Filename.ext" sein.
Die Funktion soll einfach ein Go / NoGo geben, wenn der TextString formal OK und damit prinzipiell z.B. mit StringList.SaveToFile( AFilePath ) schreibbar wäre.

Ist der FilePath formal falsch, dann habe ich die Chance diesen VOR dem SaveToFile() zu korrigieren.

Sollten dann Zugriffsrechte fehlen oder sonstwas, dann kann es eine Exception werfen,
aber die Routine soll im Vorfeld den FilePath prüfen, ob es prinzipiell überhaupt schreibbar ist, ohne Nebeneffekte oder Exceptions.

Mein Vorschlag unten funktioniert prinzipiell für eine Reihe von Fällen, die Frage ist aber gibt es vielleicht etwas Optimaleres oder
vielleicht gibt es sogar etwas Fertiges in der RTL.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#6

AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?

  Alt 14. Sep 2023, 18:17
Ich bekomme irgendeinen FilePath als Text-String rein, der kann absolut, relativ, oder auch nur ein reiner "Filename.ext" sein. Die Funktion soll einfach ein Go / NoGo geben, wenn der TextString formal OK und damit prinzipiell z.B. mit StringList.SaveToFile( AFilePath ) schreibbar wäre.
Formal OK ist auch:
Delphi-Quellcode:
fileName := '..\..\data.txt';
if IsAbsoluteFilePathValid(fileName) then
begin
  with TStringList.Create do
  try
    Add('Hier bin ich...');
    SaveToFile(fileName);
  finally
    Free;
  end;
end;
Wenn es ausreicht, ist deine Lösung OK. Ich hatte die Frage so verstanden, dass du Kontrolle willst.

Bis bald...
Thomas

Geändert von mytbo (14. Sep 2023 um 18:20 Uhr)
  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 16:01 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