![]() |
Dateipfad mit \..\ auswerten
Gibt es eine Funktion die mir einen Dateipfad der \..\ enthält auswertet?
Wäre schön wenn das für UNC wie auch für Normale Pfade funktioniert. Ich habe keine Gefunden. |
AW: Dateipfad mit \..\ auswerten
Puh, doch schwieriger als gedacht :mrgreen:
Delphi-Quellcode:
Macht das was du möchtest?
function collapsePath(path: UTF8String): UTF8String;
const delimiters = ['/', '\']; var afterLastDelim: integer; writePos: integer; readPos: integer; skip: integer; state: (sNormal, sAfterDelim, sAfterDot, sAfter2Dots); begin state := sAfterDelim; writePos := length(path); afterLastDelim := writePos; skip := 0; for readPos := length(path) downto 1 do begin if path[readPos] in delimiters then begin if (state = sNormal) or (state = sAfterDelim) then begin if skip = 0 then begin path[writePos] := path[readPos]; dec(writePos); afterLastDelim := writePos; end else begin writePos := afterLastDelim; dec(skip); end; end else // not normal begin writePos := afterLastDelim; if state = sAfter2Dots then inc(skip); end; state := sAfterDelim; end else // no delimiter begin path[writePos] := path[readPos]; dec(writePos); if path[readPos] = '.' then begin if state = sAfterDelim then state := sAfterDot else if state = sAfterDot then state := sAfter2Dots else state := sNormal; // third dot end else state := sNormal; end; end; if (state = sNormal) or (state = sAfterDelim) then begin if skip > 0 then begin writePos := afterLastDelim; dec(skip); end; end else writePos := afterLastDelim; if skip > 0 then begin path[writePos-1] := '.'; path[writePos] := '.'; dec(writePos,2); dec(skip); end; while skip > 0 do begin path[writePos-2] := '.'; path[writePos-1] := '.'; path[writePos] := '\'; dec(writePos,3); dec(skip); end; result := copy(path, writePos+1, length(path)); end; (Nicht ohne Kontrolle produktiv benutzen, nur ein bisschen getestet.) |
AW: Dateipfad mit \..\ auswerten
Das gibt es alles schon fertig. Insbesondere werden die .. Stellen ja vermutlich durch eine Kombination zweier Pfade kommen. Das geht jedenfalls in beiden Fällen direkt über die API:
Delphi-Quellcode:
Wichtig ist, dass im ersten Pfad (ggf. mit IncludeTrailingPathDelimiter angehängt) am Ende ein \ steht, wenn das ein Ordnername ist.
function PathCombine(lpszDest: PChar; const lpszDir, lpszFile: PChar): PChar; stdcall; external 'shlwapi.dll' name 'PathCombineW';
function PathCombineA(lpszDest: PAnsiChar; const lpszDir, lpszFile: PAnsiChar): PAnsiChar; stdcall; external 'shlwapi.dll'; function PathCombineW(lpszDest: PWideChar; const lpszDir, lpszFile: PWideChar): PWideChar; stdcall; external 'shlwapi.dll'; function GetCombinedPath(const BasePath, RelativePath: string): string; begin SetLength(Result, MAX_PATH); PathCombine(PChar(Result), PChar(ExtractFilePath(BasePath)), PChar(RelativePath)); SetLength(Result, StrLen(PChar(Result))); end; procedure TForm140.FormCreate(Sender: TObject); begin ShowMessage(GetCombinedPath('c:\program files\..\test\', '')); // c:\test\ ShowMessage(GetCombinedPath('c:\program files\', '..\xyz\hallo.txt')); // c:\xyz\hallo.txt end; |
AW: Dateipfad mit \..\ auswerten
|
AW: Dateipfad mit \..\ auswerten
Ja, die Funktion kenne ich, aber wenn es zwei Pfade sind, die kombiniert werden sollen, habe ich immer PathCombine benutzt.
Da ExpandFileName aber in XE2 auch eine Linux- und MacOS-Implementierung hat, macht es schon Sinn das zu benutzen, weil das dann immer geht. |
AW: Dateipfad mit \..\ auswerten
Danke alle.
also ist theoretisch ExpandUNCFilename das Richtige. Ich teste das mal eben. |
AW: Dateipfad mit \..\ auswerten
OK danke an alle,
ExpandUNCFilename!!! Die Universalmethode für alle meine Probleme... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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