Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Letztes Verzeichnis im String ermitteln (https://www.delphipraxis.net/214545-letztes-verzeichnis-im-string-ermitteln.html)

DieDolly 26. Jan 2024 17:29

Letztes Verzeichnis im String ermitteln
 
Dieser Code hier ist vermutlich schon seit 10 Jahren in meiner pas-Datei und wurde seitdem auch nicht verändert.
Ich würde euch gerne fragen, ob dieses Vorhaben besser umsetzbar ist.

Bitte nicht hauen, der Code ist uralt und echt nicht gut.

Delphi-Quellcode:
function GetLastDirectory(Directory: string): string;
var
 tmpSrcPath: string;
begin
 Directory := Trim(Directory);

 if Directory = '' then
  Exit;

 tmpSrcPath := Directory;

 if EndsStr('\', tmpSrcPath) then
  tmpSrcPath := Copy(tmpSrcPath, 1, Length(tmpSrcPath) - 1);

 if Pos(':', tmpSrcPath) > 0 then
  tmpSrcPath := StringReplace(tmpSrcPath, ':', '', [rfReplaceAll]);

 if Trim(tmpSrcPath) <> '' then
  Result := Copy(tmpSrcPath, LastDelimiter('\', tmpSrcPath) + 1, Length(tmpSrcPath))
 else
  Result := '';
end;

Uwe Raabe 26. Jan 2024 17:51

AW: Letztes Verzeichnis im String ermitteln
 
Würde ich heute so schreiben:
Delphi-Quellcode:
 
uses
  System.SysUtils, System.IOUtils;

...
 
function GetLastDirectory(const Directory: string): string;
begin
  Result := TPath.GetFileName(ExcludeTrailingPathDelimiter(Directory))
end;
Müsste man vielleicht noch mit den realen Randbedingungen testen (z.B. Pfade mit Punkten, nur Laufwerk usw.)

himitsu 26. Jan 2024 18:24

AW: Letztes Verzeichnis im String ermitteln
 
TPath.GetFullPath

DieDolly 26. Jan 2024 18:44

AW: Letztes Verzeichnis im String ermitteln
 
https://learn.microsoft.com/de-de/do...h?view=net-8.0

Was hat GetFullPath damit zu tun, wenn man das letzte Verzeichnis ermitteln möchte?

himitsu 26. Jan 2024 19:04

AW: Letztes Verzeichnis im String ermitteln
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1532634)
Müsste man vielleicht noch mit den realen Randbedingungen testen (z.B. Pfade mit Punkten, nur Laufwerk usw.)

:angle2:

DieDolly 26. Jan 2024 19:09

AW: Letztes Verzeichnis im String ermitteln
 
Ich weiß nicht warum, aber deine Antworten werfen immer mehr Fragen auf als dass sie helfen. Irgendwo natürlich schön, weil man ja auch nachdenken soll.
Das ist natürlich in einem Forum hilfreich (zu einem gewissen Maße).

Ich verstehe aber nicht, was TPath.GetFullPath mit irgendwelchen Tests zu tun haben soll. Oder soll es nicht?
Wenn ich das testen möchte, schreibe ich einfach TestFunktionXYZ('F:\') usw.

Delphi.Narium 26. Jan 2024 19:32

AW: Letztes Verzeichnis im String ermitteln
 
Bestimmt nicht die beste Lösung, aber scheint zu funktionieren:
Delphi-Quellcode:
function GetLetztesVerzeichnis(s : String) : String;
begin
  s := ExcludeTrailingPathDelimiter(ExtractFilePath(s));
  s := ReverseString(s);
  s := Copy(s,1,Pos('\',s) - 1);
  Result := ReverseString(s);
end;

himitsu 26. Jan 2024 21:04

AW: Letztes Verzeichnis im String ermitteln
 
Es gibt z.B. Probleme mit relativen Pfaden, bei solchem Vorgehen.

Zitat:

Zitat von Delphi.Narium (Beitrag 1532640)
ReverseString

Hatte ich auch schonmal so gemacht, aber im Grunde ist es nur eine Krücke, um mit POS, einer Funktion, welche das Erste sucht, das Letzte zu suchen, anstatt etwas zu verwenden, was das Letzte sucht.
Pos/PosEx in einer Schleife (immer noch schneller, als ein/zwei mal ReverseString)

Wobei das zweite ReverseString garnicht nötig ist, wenn man die gefundene Position mit Length verrechnet, um direkt aus dem originalen String zu kopieren,

aber
Delphi-Referenz durchsuchenstring.LastIndexOf
Delphi-Referenz durchsuchenstring.LastDelimiter


oder, wie es Uwe bereits zeigte, also Pfadnamenfunktionen, zum Extrahieren des letzten Namen. :angle:

Uwe Raabe 26. Jan 2024 21:20

AW: Letztes Verzeichnis im String ermitteln
 
Auch eine Alternative:
Delphi-Quellcode:
  var arr := tmpSrcPath.Split(['\', ':']); // oder auch SplitString
  Result := arr[High(arr)];

Christian Seehase 27. Jan 2024 12:02

AW: Letztes Verzeichnis im String ermitteln
 
Da unter Windows als Pfadtrenner Slash (/) und Backslash (\) zulässig sind
und das auch in beliebiger Anzahl hintereinander habe ich mir sowas erstellt:

Delphi-Quellcode:
function csExcludeTrailingPathDelimiterWin(const AsInput : string) : string;

var
  i : integer;

begin
  Result := AsInput;
  i     := length(AsInput);
  if i = 0 then exit;
  while CharInSet(AsInput[i],['\','/']) do dec(i);
  Result := Copy(AsInput,1,I);
end;
Im Explorer funktioniert das mit den gemischten und mehreren Pfadtrennern
zwar nicht, aber in der Console.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 Uhr.
Seite 1 von 2  1 2      

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