Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt (https://www.delphipraxis.net/190107-funktion-gesucht-die-den-tatsaechlichen-pfadnamen-ermittelt.html)

sundance 31. Aug 2016 09:40

Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Also so ähnlich wie
Delphi-Quellcode:
GetFullPathName()
.
Das funktioniert gut mit
Delphi-Quellcode:
GetFullPathName(".")
-> "C:\Windows\System32"
liefert aber für
Delphi-Quellcode:
GetFullPathName("c:\windows\system32")
nur "c:\windows\system32" zurück.
Ich habe auch schon probiert mit
Delphi-Quellcode:
FindFirstFile("c:\windows\system32")
; aber die Struktur WIN32_FIND_DATA enthält leider nur die unterste Ebene, hier "System32". Jetzt könnte man natürlich den gesamten Pfad damit abarbeiten, aber vielleicht gibt's da ja auch schon eine API-Funktion dafür...

Neutral General 31. Aug 2016 09:46

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Ich versteh nicht so ganz was du willst.
Was soll denn deiner Meinung bei
Delphi-Quellcode:
GetFullPathName('c:\windows\system32')

rauskommen?

uligerhardt 31. Aug 2016 09:55

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Ich sehe als Unterschied zwischen Soll und Ist nur die Großkleinschreibung. da könnte GetLongPathName helfen.

Luckie 31. Aug 2016 09:59

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Da intern Windows keine Unterschied zwischen Groß- und Kleinschreibung macht, dürfte das egal sein. Es sei denn es geht um Eyecandy beim Anzeigen.

uligerhardt 31. Aug 2016 10:00

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von Luckie (Beitrag 1346306)
Da intern Windows keine Unterschied zwischen Groß- und Kleinschreibung macht, dürfte das egal sein. Es sei denn es geht um Eyecandy beim Anzeigen.

Da, wo ich es verwende, geht es genau darum. :mrgreen:

Luckie 31. Aug 2016 10:02

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Dann schreib dir eine Funktion, die jeden Buchstaben nach eine Backslash groß schreibt.

Die Glaskugel hat ja mal funktioniert. :shock:

Aviator 31. Aug 2016 10:06

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von Luckie (Beitrag 1346309)
Dann schreib dir eine Funktion, die jeden Buchstaben nach eine Backslash groß schreibt.

Das muss ja dann aber auch nicht immer stimmen. Aber ein einfaches Auflisten der Verzeichnisse sollte die Namen in der richtigen Schreibweise auflisten.

Zitat:

Zitat von Luckie (Beitrag 1346309)
Die Glaskugel hat ja mal funktioniert. :shock:

:thumb:

Luckie 31. Aug 2016 10:09

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Warum muss das nicht immer stimmen? Genau das willst du doch oder?

uligerhardt 31. Aug 2016 10:12

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von Luckie (Beitrag 1346314)
Warum muss das nicht immer stimmen? Genau das willst du doch oder?

Vermutlich will er bei D:\MeinDelphiCode nicht D:\Meindelphicode kriegen. :stupid:

Aviator 31. Aug 2016 10:18

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von Luckie (Beitrag 1346314)
Warum muss das nicht immer stimmen? Genau das willst du doch oder?

Also was der TE will weiß ich nicht. Meine Glaskugel scheint defekt zu sein. :-D

Aber es gibt doch auch Ordnerstrukturen die so aussehen:
  • C:\Windows\System32\
  • C:\MeinOrdner\meinzweiterOrdner\
  • C:\MeinOrdner\meinDritterOrdner\
  • C:\MeinOrdner\Meinvierterordner\
Dann würde es ja auch nicht stimmen, wenn er nach dem Backslash den ersten Buchstaben groß schreiben würde. :cyclops:

Aber das ist ab diesem Zeitpunkt alles nur noch reine Spekulation. Der TE soll sich mal dazu äußern, was er wirklich will. Ich habe die Eingangsfrage nämlich auch nicht wirklich verstanden. Für mich ist da auch nur der Unterschied der Groß-/Kleinschreibung zu erkennen. :roll:

Luckie 31. Aug 2016 10:18

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Erst alles klein schreiben (LowerCase) und dann "jeden ersten Buchstaben nach einem Backslash groß".

uligerhardt 31. Aug 2016 10:21

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von Luckie (Beitrag 1346317)
Erst alles klein schreiben (LowerCase) und dann "jeden ersten Buchstaben nach einem Backslash groß".

Klappt bei Aviators und meinen Beispielen eben nicht.

Luckie 31. Aug 2016 10:26

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Warum?
Code:
C:\MeinOrdner\meinDritterOrdner\ -> C:\meinordner\meindritterordner\ -> C:\Meinordner\Meindritterordner\
Oder was hab eich da jetzt übersehen?

t.roller 31. Aug 2016 10:28

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Delphi-Quellcode:
function TitleCase2(const sText: String;
         const bLowerCaseFirst: Boolean = True): String;
const
  cDelimiters = [#9, #10, #13, ' ', ',', '.', ':', ';', '"',
                 '\', '/', '(', ')', '[', ']', '{', '}'];
var
  iLoop: Integer;
begin
  Result := sText;
  if (Result <> '') then
  begin
    Result[1] := UpCase(Result[1]);
    for iLoop := 2 to Length(Result) do
      if (Result[iLoop - 1] in cDelimiters) then
        Result[iLoop] := UpCase(Result[iLoop]);
  end;
end;

function GetLongPathName(ShortName:String):String;
var NameS: String;
     Len : integer;
     Buffer: array[0..MAX_PATH] of Char;
     pDummy: PCHAR;
begin
     Len := GetFullPathName(PChar(ShortName), 0, PChar(result), pDummy);
     SetLength(NameS, Len);
     GetFullPathName(PChar(ShortName), Len, PChar(NameS), pDummy);
     result := TitleCase2(NameS);
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
Caption:= GetLongPathName('c:\windows\system32');
end;
Alternative:
Delphi-Quellcode:
function TitleCase3(const sText: String;
         const bLowerCaseFirst: Boolean = True): String;
var
  iLoop: Integer;
begin
  Result := sText;
  if (Result <> '') then
  begin
    Result[1] := UpCase(Result[1]);
    for iLoop := 2 to Length(Result) do
      if (not (Result[iLoop - 1] in ['a'..'z','A'..'Z','0'..'9'])) then
          Result[iLoop] := UpCase(Result[iLoop]);
  end;
end;

function GetLongPathName(ShortName:String):String;
var NameS: String;
     Len : integer;
     Buffer: array[0..MAX_PATH] of Char;
     pDummy: PCHAR;
begin
     Len := GetFullPathName(PChar(ShortName), 0, PChar(result), pDummy);
     SetLength(NameS, Len);
     GetFullPathName(PChar(ShortName), Len, PChar(NameS), pDummy);
     result := TitleCase3(NameS);
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
Caption:= GetLongPathName('C:\Windows\System32\ATEST\123Test');
end;

uligerhardt 31. Aug 2016 10:30

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von Luckie (Beitrag 1346319)
Warum?
Code:
C:\MeinOrdner\meinDritterOrdner\ -> C:\meinordner\meindritterordner\ -> C:\Meinordner\Meindritterordner\
Oder was hab eich da jetzt übersehen?

Ich habe den OP so interpretiert als würde er eine "kanonische" Form des Namens im Dateisystem wollen.

Aber vorzugsweise sollte sundance sich halt mal äußern.

sundance 31. Aug 2016 10:36

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Sorry für die Verwirrung bedingt durch die unklare Formulierung.
Es ist tatsächlich so (Glaskugel = OK), dass mich die korrekte Schreibweise (Groß-/Kleinschreibung) interessiert.
Und das, wie schon angemerkt, nicht aus funktionellen, sondern nur aus optischen Gründen.

uligerhardt 31. Aug 2016 10:40

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von sundance (Beitrag 1346322)
Sorry für die Verwirrung bedingt durch die unklare Formulierung.
Es ist tatsächlich so (Glaskugel = OK), dass mich die korrekte Schreibweise (Groß-/Kleinschreibung) interessiert.
Und das, wie schon angemerkt, nicht aus funktionellen, sondern nur aus optischen Gründen.

Na dann siehe Post 3. :-D

bra 31. Aug 2016 10:41

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Was liefert das zurück:

Delphi-Quellcode:
GetFullPathName("c:\windows\system32\.")


GetLongPathName kann dir eventuell den Pfad ändern, wenn du einen kurzen Namen übergibts (c:\win~12).

sundance 31. Aug 2016 10:52

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Delphi-Quellcode:
GetFullPathName('c:\windows\system32\.')
-> c:\windows\system32 (das hatte ich auch schon probiert... :?)

Delphi-Quellcode:
GetLongPathName('c:\windows\system32')
-> c:\Windows\System32
Damit kann ich "leben"... Es ist ohnehin fraglich, ob die "richtige" Schreibweise für Laufwerksbuchstaben groß oder klein ist...
(ich hätte schwören können, dass ich die Funktion schon probiert habe...)

Vielen Dank an alle Beteiligten für die spontane Hilfe!

Assarbad 5. Sep 2016 17:04

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Zitat:

Zitat von Luckie (Beitrag 1346306)
Da intern Windows keine Unterschied zwischen Groß- und Kleinschreibung macht, dürfte das egal sein.

Du meinst sicher:

Zitat:

Zitat von Luckie (Beitrag 1346306)
Da das Win32-Subsystem keinen Unterschied zwischen Groß- und Kleinschreibung macht, dürfte das egal sein.

;)

Denn sowohl Windows macht intern einen Unterschied und - es wird noch besser - NTFS ist es auch wichtig.

Aber wenn du ausdrücken wolltest, daß Groß- und Kleinschreibung in Windows für einen Delphiprogrammierer egal ist, hast du absolut recht. Denn aus dem Win32-Subsystem kommste mit Delphi im Prinzip nicht raus.

Wollte nur klarstellen, daß intern durchaus unterschieden wird und ich in meiner Funktion als Treiberentwickler sehr wohl einen Stream ("Dateiinstanz") unter verschiedenen Namen zu verschiedenen Zeitpunkten sehen kann - und zwar nicht nur während die Datei gerade umbenannt wird. Für mich ist das Flag OBJ_CASE_INSENSITIVE dann wichtig.

Zitat:

Zitat von sundance (Beitrag 1346326)
Es ist ohnehin fraglich, ob die "richtige" Schreibweise für Laufwerksbuchstaben groß oder klein ist...

Korrekt ist die Großschreibung. Guck mal mit WinObj (von Microsoft) in \GLOBAL?? (bzw. \DosDevices oder \?? vor Vista), dann weißte warum.

Übrigens kann man einfach - solange es sich um ASCII-Zeichen handelt - das Bit $20 (weil: Ord('a') - Ord('A') = $20) setzen um Kleinschreibung oder löschen um Großschreibung zu erzwingen.

Luckie 5. Sep 2016 19:31

AW: Funktion gesucht, die den tatsächlichen Pfadnamen ermittelt
 
Ja, genau so meinte ich es. Ich wollte nur nicht unnötig Verwirrung stuften. :mrgreen:


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