Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 Uhr.
Seite 2 von 3     12 3      

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