Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi [Gelöst] Relativen Pfad in absoluten umwandeln (https://www.delphipraxis.net/185458-%5Bgeloest%5D-relativen-pfad-absoluten-umwandeln.html)

Dalai 12. Jun 2015 15:08

[Gelöst] Relativen Pfad in absoluten umwandeln
 
Hallo ihr :),

gleich vorweg: nein, es geht nicht um die üblichen relativen Pfade wie
Code:
..\..\pfad\datei.exe
Gegeben sei folgender relativer Pfad:
Code:
system32\dateiname.exe
Wie bekommt man daraus auf einfache Weise den absoluten Pfad? PathFindOnPath arbeitet offenbar nur, wenn man ihm nur den Dateinamen übergibt. Auch unter den anderen Shell Path Handling Functions ist irgendwie nichts passendes dabei.

Nun könnte man auf die Idee kommen, mit ExtractFileName den Dateinamen aus dem gegebenen Pfad zu extrahieren und danach mit PathFindOnPath nach der Datei suchen zu lassen. Aber dadurch geht die Information über den Pfad verloren, oder anders ausgedrückt: was ist, wenn es mehrere gleichnamige Dateien in einem Verzeichnis im %PATH% gibt? Dieser Weg ist also zu unzuverlässig.

Kaum vorstellbar, dass (sich) nicht schon jemand vor mir diese Frage gestellt hat, nur bin ich offenbar zu doof, die passende Antwort zu finden. Wer kann mir den richtigen Weg zeigen?

MfG Dalai

noisy_master 12. Jun 2015 15:18

AW: Relativen Pfad in absoluten umwandeln
 
Moin,

da dein Pfad nicht ein-eindeutig ist dürfte das wohl schwer werden.....

c:\a\system32\dateiname.exe und c:\b\system32\dateiname.exe...... welcher soll es denn nun sein?

Dalai 12. Jun 2015 15:32

AW: Relativen Pfad in absoluten umwandeln
 
Naja, für den o.g. Pfad ist dieser absolute Pfad gemeint:
Code:
%SystemRoot%\system32\dateiname.exe
Mal etwas genauer formuliert: Die Pfade stammen aus der Konfiguration von Diensten oder Autostarts. Es sind dabei immer Pfade, die auf Verzeichnisse im %PATH% verweisen/liegen, so dass sie vom System selbst auch gefunden werden. Wenn es Duplikate gibt, dann soll der erste Fund benutzt werden, genau wie es PathFindOnPath auch handhabt. Aber ich will vermeiden, von Hand durch die Verzeichnisliste von %PATH% zu iterieren, um den passenden Dateinamen zu finden; ich will es eben einfacher ;).

MfG Dalai

mkinzler 12. Jun 2015 15:42

AW: Relativen Pfad in absoluten umwandeln
 
Das wird aber nicht so gehen, da auch Windows den Pfd durch einfaches "Ausprobieren" (Iterieren durch Pfadliste) ermittelt.

ringli 12. Jun 2015 16:01

AW: Relativen Pfad in absoluten umwandeln
 
Wie wäre es damit?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ShortName,
  LongName: string;
begin
  ShortName:= 'system32\dateiname.exe';
  LongName := FileSearch(ShortName, GetEnvironmentVariable('Path'));
  showmessage(LongName);
end;

Dalai 12. Jun 2015 16:58

AW: Relativen Pfad in absoluten umwandeln
 
@ringli: Ah, dankeschön! FileSearch kann tatsächlich mit relativen Pfaden arbeiten. Allerdings ist dein Code so nicht verwendbar, da GetEnvironmentVariable ein DWORD zurückgibt und den Inhalt der Umgebungsvariable in einem der Parameter. Aber das Prinzip zählt :).

MfG Dalai

ringli 12. Jun 2015 17:02

AW: Relativen Pfad in absoluten umwandeln
 
Zitat:

Zitat von Dalai (Beitrag 1304981)
Allerdings ist dein Code so nicht verwendbar, ...

Bei mir läuft der genau so wie ich ihn gepostet habe, allerdings kann sich da zwischen Delphi 5 und Delphi XE4 auch was im Aufruf geändert haben. ;)

SMO 12. Jun 2015 17:05

AW: Relativen Pfad in absoluten umwandeln
 
Ringli nutzt System.SysUtils.GetEnvironmentVariable.
Dalai denkt wohl an die gleichnamige WinAPI.

Dalai 12. Jun 2015 17:40

AW: Relativen Pfad in absoluten umwandeln
 
Zitat:

Zitat von SMO (Beitrag 1304983)
Ringli nutzt System.SysUtils.GetEnvironmentVariable.
Dalai denkt wohl an die gleichnamige WinAPI.

In der Tat. Wusste nicht, dass es da einen Wrapper gibt (offenbar seit Delphi 6 oder 7).

MfG Dalai

Dejan Vu 12. Jun 2015 20:17

AW: Relativen Pfad in absoluten umwandeln
 
Zitat:

Zitat von ringli (Beitrag 1304976)
Wie wäre es damit

:thumb:


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