Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Existenz langer Pfade (https://www.delphipraxis.net/193192-existenz-langer-pfade.html)

samso 4. Jul 2017 13:33

AW: Existenz langer Pfade
 
Je nachdem ob es sich um einen UNC-Pfad handelt, oder um ein lokales Laufwerk muss man für lange Pfade unterschiedliche Präfixes anfügen. Mein erster Versuch daraus eine Funktion zu machen:

Delphi-Quellcode:
function GetPrefixedPath(const aPath: string): string;
begin
  if aPath.StartsWith('\\')
  then begin
    if System.IOUtils.TPath.GetExtendedPrefix(aPath)=TPathPrefixType.pptNoPrefix
    then
      Result := '\\?\UNC\' + copy(aPath, 3, MaxInt)
    else
      Result := aPath;
  end
  else
    Result := '\\?\' + aPath;

SneakyBagels 4. Jul 2017 13:48

AW: Existenz langer Pfade
 
Diese Funktion verstehe ich nicht ganz.
Könntest du ein paar Beispiele (Text, hier im Forum) anfügen?

So wie ich zuvor vielleicht
Delphi-Quellcode:
 ShowMessage( getUNCPath('Y:\') ); // Y = Netzlaufwerk. Resultat => Y:\
 ShowMessage( getUNCPath('C:\') ); // C = Systemlaufwerk. Resultat => \\?\C:\
Wo wir schon einmal dabei sind:
\\?\ lässt sich auch auf Netzlaufwerke anwenden, wenn sie gemounted sind (also keine reine IP).

Ich würde wenn dann ja eher so machen
Delphi-Quellcode:
function getUNCPath(const aPath: string): string;
begin
 Result := aPath;

 if not aPath.StartsWith('\\') then // <=== hinzugefügt, damit aus \\192.168.0.1 nicht \\?\\\192.168.0.1 gemacht wird
  if TPath.GetExtendedPrefix(aPath) = TPathPrefixType.pptNoPrefix then
   Result:= '\\?\' + aPath;
end;

function removeUNCFromPath(const aPath: string): string;
begin
 Result := aPath;

 if TPath.GetExtendedPrefix(aPath) = TPathPrefixType.pptExtended then // \\?\ present
  Delete(Result, 1, 4);
end;
Aber was ist jetzt richtig-er bzw überhaupt richtig und funktionstüchtig? Würde mich auch brennend interessieren.

samso 4. Jul 2017 14:37

AW: Existenz langer Pfade
 
Der Präfix \\?\ darf immer angefügt werden, weil das der Windows-Api lediglich mitteilt "Achtung der Pfad kann länger als MAX_PATH Zeichen sein"

"C:\EinPfad\usw.txt" => "\\?\C:\EinPfad\usw.txt"
"Y:\EinPfad\usw.txt" => "\\?\Y:\EinPfad\usw.txt"
"COM45:" => "\\?\COM45:"
"\\QNAP\MyShare\Daten\usw.txt" => "\\?\UNC\QNAP\MyShare\Daten\usw.txt"

SneakyBagels 4. Jul 2017 14:45

AW: Existenz langer Pfade
 
Zitat:

"\\QNAP\MyShare\Daten\usw.txt" => "\\?\UNC\QNAP\MyShare\Daten\usw.txt"
Wenn du deiner Funktion \\192.168.0.1\volumenname übergibst, dann würde \\?\UNC\192.168.0.1\volumenname daraus werden was in einem Fehler resultiert.

samso 4. Jul 2017 14:49

AW: Existenz langer Pfade
 
Zitat:

Zitat von SneakyBagels (Beitrag 1375960)
Wenn du deiner Funktion \\192.168.0.1\volumenname übergibst, dann würde \\?\UNC\192.168.0.1\volumenname daraus werden was in einem Fehler resultiert.

Habe ich bei mir gerade mit Windows 10 getestet. Ergibt bei mir keinen Fehler.

SneakyBagels 4. Jul 2017 14:51

AW: Existenz langer Pfade
 
Ist \\?\UNC\192.168.0.1\volumenname (oder welche IP auch immer, aber es muss eine IP sein) bei dir erreichbar mit \\?\UNC\ davor?

Edit:
gerade "\\?\UNC\192.168.0.1\volumenname" (Festplatte am Router die so auch zum Test existiert) unter Windows 10 getestet mit Resultat
Zitat:

[Window Title]
Explorer

[Content]
Die Datei "\\?\UNC\192.168.0.1\volumenname" wurde nicht gefunden. Überprüfen Sie die Schreibweise, und wiederholen Sie den Vorgang.

[OK]

samso 4. Jul 2017 14:58

AW: Existenz langer Pfade
 
Äh, Du testest das mit dem Windows-Explorer??

Nur noch mal zur Erläuterung: Ein UNC-Pfad hat die Form "\\server\blub". Der Präfix "\\?\" und "\\?\UNC\" hat mit UNC nichts zu tun, sondern ist eine Krücke die von MS irgendwann (für Windows NT?) erfunden wurde, um die API-Aufrufe zu erweitern.

Ich teste das z.B. mit
Delphi-Quellcode:
   
  if DirectoryExists(GetPrefixedPath('\\192.168.0.1\data\test'))
  then
    writeln('Direktory gefunden');
Und das funktioniert.

SneakyBagels 4. Jul 2017 15:12

AW: Existenz langer Pfade
 
Welchen Unterschied hat denn dann \\?\UNC und \\?\

?

samso 4. Jul 2017 15:37

AW: Existenz langer Pfade
 
Ich würde das mal frei so beschreiben:

"\\?\": Notation für ein lokales Laufwerke oder Gerät
"\\?\UNC\": Notation für ein Netzwerklaufwerk

Wie wir ja aus #1 gelernt haben funktioniert die Notation "\\?\\\QNAP\abc" ja nicht. Die Notation "\\?\UNC\QNAP\abc" führt hingegen zum gewünschten Ergebnis.

SneakyBagels 4. Jul 2017 15:53

AW: Existenz langer Pfade
 
Zitat:

"\\?\": Notation für ein lokales Laufwerke oder Gerät
"\\?\UNC\": Notation für ein Netzwerklaufwerk
So etwas in der Art dachte ich mir schon. Gut zu wissen. Ich denke unsere Lösungen sind jetzt quasi gleich. Aber ich bin sicher es geht noch besser.

Delphi-Quellcode:
function getUNCPath(const aPath: string): string;
begin
 Result := aPath;

 if aPath.StartsWith('\\') then
  begin
   if TPath.GetExtendedPrefix(aPath) = TPathPrefixType.pptNoPrefix then
    Result := '\\?\UNC\' + Copy(aPath, 3, Length(aPath));
  end
 else
  Result := '\\?\' + aPath;
end;

function removeUNCFromPath(const aPath: string): string;
begin
 Result := aPath;

 if TPath.GetExtendedPrefix(aPath) = TPathPrefixType.pptExtended then // \\?\ present
  Delete(Result, 1, 4)
 else if TPath.GetExtendedPrefix(aPath) = TPathPrefixType.pptExtendedUNC then // \\?\UNC\ present
  Delete(Result, 3, 6);
end;


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

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