![]() |
Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?
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:
Da spielt die Frage, ob absoluter oder relativer Pfad mit rein, also
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 ) - 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:
und schaut einfach, ob es Pfad-Anteil und File-Anteil im FilePath gibt.
/ 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; 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
Delphi-Quellcode:
könnte auch
function IsAbsoluteFilePathValid( const AFilePath ) : Boolean;
Delphi-Quellcode:
gut passen.
function IsFilePathWriteable( const AFilePath ) : Boolean;
Ist aber etwas irreführend, weil es mir dabei momentan nicht um die Zugriffsrechte geht. Also, ist das besser ?
Delphi-Quellcode:
Ich würde gerne das moderne System.IOUtils dafür nutzen, aber anscheinend kommt man um System.SysUtils nicht immer herum.
function IsFilePathAccessible( const AFilePath ) : Boolean;
Wie seht ihr das, gibt es da überhaupt eine "optimale" Version, die alle Fälle abdeckt ? |
AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?
Was spricht denn gegen
Delphi-Quellcode:
oder (als Old School) auch
TDirectory.Exists
Delphi-Quellcode:
? Kannst du Fälle wo das nicht funktioniert?
DirectoryExists
|
AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?
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. |
AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?
Zitat:
Delphi-Quellcode:
Bis bald...
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); Thomas |
AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?
Zitat:
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. |
AW: Beste Methode, um "IsAbsoluteFilePathValid" narrensicher zu implementieren ?
Zitat:
Delphi-Quellcode:
Wenn es ausreicht, ist deine Lösung OK. Ich hatte die Frage so verstanden, dass du Kontrolle willst.
fileName := '..\..\data.txt';
if IsAbsoluteFilePathValid(fileName) then begin with TStringList.Create do try Add('Hier bin ich...'); SaveToFile(fileName); finally Free; end; end; Bis bald... Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 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