Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   relativen -> absoluten Pfad (als Text) erzeugen (https://www.delphipraxis.net/90553-relativen-absoluten-pfad-als-text-erzeugen.html)

Gruber_Hans_12345 19. Apr 2007 12:32


relativen -> absoluten Pfad (als Text) erzeugen
 
ich habe zwei strings, einmal das aktuelle verzeichnis, und einmal ein zielverzeichnis.
nun brauche ich eine funktion, die mir aus diesen zwei strings das zielverzeichnis berechnet.
Gibt es da was fertiges? oder muß ich das selber machen?

z.B.:
Aktuelles Dir : c:\temp\Prog1\data\
Ziel dir : ..\..\Prog2\bin
Ausgabe : c:\temp\Prog2\bin

DelphiKlaus 19. Apr 2007 12:42

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
Kannst Du die beiden Pfade nicht einfach hintereinandersetzen:

c:\temp\Prog1\data\..\..\Prog2\bin

Sieht zwar komisch aus, aber meines Wissens funktioniert das.

Gruber_Hans_12345 19. Apr 2007 12:46

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
hmmmm, stimmt könnte funktionieren ...

aber leider brauche ich den "richtigen" namen, da ich auch gucken muß, ob das File bereits schon gelesen wurde, und so kann es sein, das ich das selbe File vom selben platz mit unterschiedlichen Pfadangaben 2 oder mehrfach einlese ...

mkinzler 19. Apr 2007 12:48

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
Du mußt den Pfad in einzelene Teile zerlegen und denn Zielpfad dann neu zusammensetzen.

jfheins 19. Apr 2007 12:57

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
Also das hört sich doch schon sehr ähnlich an:
Zitat:

ExpandFileName Routine

Gibt den vollständigen Pfad eines relativen Dateinamens zurück.

Unit
SysUtils

Syntax


[Delphi] function ExpandFileName(const FileName: string): string;


Beschreibung
ExpandFileName konvertiert einen relativen Dateinamen in einen vollständigen Pfadnamen, indem dem Dateinamen das aktuelle Verzeichnis und das aktuelle Laufwerk hinzugefügt wird. ExpandFileName prüft nicht, ob der Rückgabewert auf eine existierende Datei verweist.
Hinweis:
ExpandFileName unterstützt nicht das UNC-Format. Verwenden Sie zur Erweiterung eines UNC-Dateinamens die Routine ExpandUNCFileName .

Oder ?

Gruber_Hans_12345 19. Apr 2007 13:01

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
Zitat:

Zitat von jfheins
Also das hört sich doch schon sehr ähnlich an: Oder ?

ja, aber leider nur so ähnlich, aber ich könnte mal den source von ExpandFileName angucken, vielleicht kann ich da das rausholen was ich brauche

(ExpandFileName, geht glaub ich immer auf den aktuellen Pfad, ich muß den Pfad angeben können)

[edit]schade, ExpandFileName ruft direkt eine WinAPI Funktion auf, daher wirds wohl keine Sourcecode copy geben :(

ich könnte zwar jedesmal SetCurrentDir setzen, und dann ExpandFileName verwenden, ist aber nicht wirklich schön

Hawkeye219 19. Apr 2007 13:37

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
Hallo Hans,

warum kombinierst du nicht die beiden angebotenen (Teil-)Lösungen?

Delphi-Quellcode:
var
  s1, s2, Path : string;
begin
  s1 := 'c:\temp\Prog1\data\';
  s2 := '..\..\Prog2\bin';
  Path := ExpandFileName(s1 + s2);
end;
Gruß Hawkeye

Gruber_Hans_12345 19. Apr 2007 13:40

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
Zitat:

Zitat von Hawkeye219
Hallo Hans,

warum kombinierst du nicht die beiden angebotenen (Teil-)Lösungen?

ne, das wäre ja zu leicht ;)

ja, danke funkt perfekt ... hab irgendwie zu komisch gedacht dabei ...

SirThornberry 19. Apr 2007 13:42

Re: relativen -> absoluten Pfad (als Text) erzeugen
 
ich hab mir dafür mal folgende Funktion geschrieben:
Delphi-Quellcode:
function RelToAbsPath(ACurPath, ARelPath: String): String;
var
  lCopiedTo,
  lCount   : Integer;
  lParts   : TStringList;
  lStr     : String;
begin
  ARelPath := StringReplace(ARelPath, '/', '\', [rfReplaceAll]);
  ACurPath := StringReplace(ACurPath, '/', '\', [rfReplaceAll]);
  lParts   := TStringList.Create();

  if (copy(ARelPath, 1, 2) = '.\') or (copy(ARelPath, 1, 3) = '..\') then
  begin
    if (copy(ACurPath, Length(ACurPath), 1) = '\') then
      ARelPath := ACurPath + ARelPath
    else
      ARelPath := ACurPath + '\' + ARelPath;
  end;

  lCopiedto := 0;
  for lCount := 1 to Length(ARelPath) - 1 do
  begin
    if (ARelPath[lCount] = '\') then
    begin
      lStr := copy(ARelPath, lCopiedto + 1, lCount - lCopiedTo - 1);
      if (lStr <> '') then
        lParts.Add(lStr);
      lCopiedTo := lCount;
    end;
  end;
  lStr := copy(ARelPath, lCopiedTo + 1, Length(ARelPath));
  if (lStr <> '') then
    lParts.Add(lStr);

  lCount := 0;
  while (lCount < lParts.Count) do
  begin
    if (lParts.Strings[lCount] = '.') then
      lParts.Delete(lCount)
    else if (lParts.Strings[lCount] = '..') then
    begin
      lParts.Delete(lCount);
      if (lCount > 1) then
      begin
        lParts.Delete(lCount - 1);
        dec(lCount);
      end;
    end
    else
      inc(lCount);
  end;

  lStr := '';
  for lCount := 0 to lParts.Count - 2 do
    lStr := lStr + lParts.Strings[lCount] + '\';
  if (lParts.Count > 0) then
    lStr := lStr + lParts.Strings[lParts.Count - 1];

  lParts.Free;

  result := lStr;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 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