Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ExcludeTrailingPathDelimiter defekt (https://www.delphipraxis.net/189225-excludetrailingpathdelimiter-defekt.html)

himitsu 19. Mai 2016 12:36

Delphi-Version: 5

ExcludeTrailingPathDelimiter defekt
 
Wieso liefert ExcludeTrailingBackslash/ExcludeTrailingPathDelimiter seit Jahrzehnten ein falschs Ergebnis für Root-Verzeichnisse?

Delphi-Quellcode:
ExtractPath('D:\aaa\bbb') = 'D:\aaa\'
ExtractDir('D:\aaa\bbb') = 'D:\aaa'
ExcludeTrailingPathDelimiter('D:\aaa\') = 'D:\aaa'

ExtractPath('D:\aaa') = 'D:\'
ExtractDir('D:\aaa') = 'D:\'
ExcludeTrailingPathDelimiter('D:\') = 'D:' // So, nun ist das plötzlich ein relativer Pfad, obwohl er vorher absolut war.

ExtractFileDir(IncludeTrailingPathDelimiter('D:\') + 'dummy') = 'D:\' // bescheuertste Lösung

Sir Rufo 19. Mai 2016 12:53

AW: ExcludeTrailingPathDelimiter defekt
 
Der liefert doch nicht das falsche Ergebnis ... sondern da passiert genau das, was der Name verspricht :stupid:

(Du erwartest da etwas anderes, das mag sein ... allerdings lässt der Name nicht hoffen, dass du hier mit deiner Erwartung richtig liegst)

himitsu 19. Mai 2016 14:14

AW: ExcludeTrailingPathDelimiter defekt
 
Es geht auch andersrum zu Argumentieren.
* das Ding soll "nur" den "abschließenden" Delimiter entfernen, also den Letzten
* der erste "Delimiter" ist aber kein Delimiter zwischen zwei Verzeichnisnamen, sondern er gibt die Relation an :stupid:
und schon stimmt der Funktionsname dennoch.
OK, beim alten ExcludeTrailingBackslash sah das noch anders aus.

Delphi-Quellcode:
ExcludeTrailingPathDelimiter(ExtractFilePath('C:\dir\dat.ei')) = ExtractFileDir('C:\dir\dat.ei')
?

Sir Rufo 19. Mai 2016 14:37

AW: ExcludeTrailingPathDelimiter defekt
 
Der PathDelimiter ist der übergeordnete Begriff für Backslash - das ist der PathDelimiter unter Windows.

Also sollten beide unter Windows exakt gleich arbeiten.

Wenn du
Delphi-Quellcode:
ExcludeTrailingBackslash
richtig deutest, dann sollte das mit
Delphi-Quellcode:
ExcludeTrailingPathDelimiter
jetzt auch funktionieren :stupid:

Oder mal anders gesagt:

Diese Funktionen entfernen bei einem string das letzt Zeichen, wenn es sich hierbei um den PathDelimiter (Backslash) handelt. Mehr gibt die Bezeichnung auch nicht her.

Da wird nichts weiter interpretiert.

Delphi-Quellcode:
ExtractPath
bzw.
Delphi-Quellcode:
ExtractDir
interpretieren den Wert dagegen schon hinsichtlich des Root-Eintrags.

Christian Seehase 19. Mai 2016 16:25

AW: ExcludeTrailingPathDelimiter defekt
 
Zitat:

Zitat von Sir Rufo (Beitrag 1338464)
Der PathDelimiter ist der übergeordnete Begriff für Backslash - das ist der PathDelimiter unter Windows.

Da muss ich Dich leider korrigieren :wink:

Unter Windows sind \ und / als Pfadtrennzeichen gleichberechtigt.

z.B.:
C:\DIR\DAT.EI
wird von Windows genauso interpretiert wie:
C:/DIR/DAT.EI
oder auch
C:\/////\\\\\DIR/////\/\DAT.EI

Sir Rufo 19. Mai 2016 16:47

AW: ExcludeTrailingPathDelimiter defekt
 
Das ist doch nicht schlimm ...

... Delphi hängt unter Windows den Backslash als PathDelimiter dran.

himitsu 19. Mai 2016 18:10

AW: ExcludeTrailingPathDelimiter defekt
 
Das Problem ist halt, dass C:\DIR\DAT.EI nicht gleich C:DIR\DAT.EI ist, bzw. C: ist nicht C:\
Denn der erste "Pathdelimiter" hat halt eine etwas "andere" Funktion.

Genau so, wie bei einer URL die ersten beiden // auch keine Pathdelimiter sind, bzw. die gehören nichtmal zum Pfad. (sind quasi die Trennzeichen zwischen Protokoll und Pfad/Daten)

Sir Rufo 19. Mai 2016 18:31

AW: ExcludeTrailingPathDelimiter defekt
 
Wenn man es ganz genau nimmt, dann gibt es ein (oder mehrere) Zeichen, die ein PathDelimiter sind.

Das ist einfach mal so.

Jetzt gibt es aber für diese PathDelimiter innerhalb eines bestimmten Kontext unterschiedliche Bedeutungen. Diese Bedeutungen erschließen sich allerdings auch erst durch den Kontext und nicht einfach durch eine einzelne Betrachtung des Zeichens.

Da
Delphi-Quellcode:
IncludeTrailingPathDelimiter
und
Delphi-Quellcode:
IncludeTrailingBackslash
diesen Kontext nicht beachten du aber etwas benötigst, dass den Kontext beachtet gilt schon mal Folgendes:
Zitat:

Das sind nicht die Droiden die Ihr sucht!
Gib doch mal eine Liste der Eingaben und der gewünschten Ausgaben vor, dann findet sich auch die Funktion dazu.

BUG 20. Mai 2016 00:04

AW: ExcludeTrailingPathDelimiter defekt
 
Ich würde SirRufo zustimmen: Vom Namen her ist das Ding ist eine Stringfunktion, die nichts über Semantik weiß.
Der Artikel hier ist vielleicht ganz interessant für dich.

jaenicke 20. Mai 2016 04:10

AW: ExcludeTrailingPathDelimiter defekt
 
Nun, eine Standardverwendung ist z.B. Zum Zusammenbauen eines Verzeichnis-Strings.
Wenn die Funktionen da nicht immer gleich funktionieren würden, kämen ggf. Verzeichnisse mit doppelten Pfadtrennzeichen usw. heraus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf