AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateipfad mit \..\ auswerten

Ein Thema von QuickAndDirty · begonnen am 8. Nov 2011 · letzter Beitrag vom 9. Nov 2011
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#1

Dateipfad mit \..\ auswerten

  Alt 8. Nov 2011, 17:27
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Dateipfad mit \..\ auswerten

  Alt 8. Nov 2011, 21:33
Puh, doch schwieriger als gedacht

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.)
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.650 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Dateipfad mit \..\ auswerten

  Alt 8. Nov 2011, 22:50
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.dllname '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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Dateipfad mit \..\ auswerten

  Alt 8. Nov 2011, 22:55
Ihr macht euch aber auch das Leben schwer
Delphi-Referenz durchsuchenExpandFileName
Delphi-Referenz durchsuchenExpandUNCFileName
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.650 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Dateipfad mit \..\ auswerten

  Alt 8. Nov 2011, 23:18
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dateipfad mit \..\ auswerten

  Alt 9. Nov 2011, 10:46
Danke alle.

also ist theoretisch ExpandUNCFilename das Richtige.

Ich teste das mal eben.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#7

AW: Dateipfad mit \..\ auswerten

  Alt 9. Nov 2011, 10:53
OK danke an alle,

ExpandUNCFilename!!! Die Universalmethode für alle meine Probleme...
Andreas
Monads? Wtf are Monads?
  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 11:03 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