![]() |
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; |
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:
Wo wir schon einmal dabei sind:
ShowMessage( getUNCPath('Y:\') ); // Y = Netzlaufwerk. Resultat => Y:\
ShowMessage( getUNCPath('C:\') ); // C = Systemlaufwerk. Resultat => \\?\C:\ \\?\ 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:
Aber was ist jetzt richtig-er bzw überhaupt richtig und funktionstüchtig? Würde mich auch brennend interessieren.
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; |
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" |
AW: Existenz langer Pfade
Zitat:
|
AW: Existenz langer Pfade
Zitat:
|
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:
|
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:
Und das funktioniert.if DirectoryExists(GetPrefixedPath('\\192.168.0.1\data\test')) then writeln('Direktory gefunden'); |
AW: Existenz langer Pfade
Welchen Unterschied hat denn dann \\?\UNC und \\?\
? |
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. |
AW: Existenz langer Pfade
Zitat:
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. |
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