Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dateipfad mit \..\ auswerten (https://www.delphipraxis.net/164336-dateipfad-mit-%5C-%5C-auswerten.html)

QuickAndDirty 8. Nov 2011 16:27


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.

BUG 8. Nov 2011 20:33

AW: Dateipfad mit \..\ auswerten
 
Puh, doch schwieriger als gedacht :mrgreen:

Delphi-Quellcode:
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;
Macht das was du möchtest?
(Nicht ohne Kontrolle produktiv benutzen, nur ein bisschen getestet.)

jaenicke 8. Nov 2011 21:50

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:
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;
Wichtig ist, dass im ersten Pfad (ggf. mit IncludeTrailingPathDelimiter angehängt) am Ende ein \ steht, wenn das ein Ordnername ist.

Sir Rufo 8. Nov 2011 21:55

AW: Dateipfad mit \..\ auswerten
 
Ihr macht euch aber auch das Leben schwer ;)
Delphi-Referenz durchsuchenExpandFileName
Delphi-Referenz durchsuchenExpandUNCFileName

jaenicke 8. Nov 2011 22:18

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.

QuickAndDirty 9. Nov 2011 09:46

AW: Dateipfad mit \..\ auswerten
 
Danke alle.

also ist theoretisch ExpandUNCFilename das Richtige.

Ich teste das mal eben.

QuickAndDirty 9. Nov 2011 09:53

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