AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Existenz langer Pfade

Ein Thema von tomkupitz · begonnen am 3. Jul 2017 · letzter Beitrag vom 4. Jul 2017
Antwort Antwort
Seite 2 von 3     12 3      
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#11

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 13:33
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;

Geändert von samso ( 4. Jul 2017 um 14:33 Uhr) Grund: Wenn der Pfad nicht mit "\\" beginnt, kann der Präfix direkt angefügt werden
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#12

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 13:48
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.

Geändert von SneakyBagels ( 4. Jul 2017 um 14:26 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#13

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 14:37
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"

Geändert von samso ( 5. Jul 2017 um 04:41 Uhr) Grund: Kommentar hinzugfügt
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#14

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 14:45
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.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#15

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 14:49
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.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#16

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 14:51
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]

Geändert von SneakyBagels ( 4. Jul 2017 um 14:54 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#17

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 14:58
Ä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.

Geändert von samso ( 4. Jul 2017 um 15:05 Uhr) Grund: Erläuterung nachgereicht
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#18

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 15:12
Welchen Unterschied hat denn dann \\?\UNC und \\?\

?
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#19

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 15:37
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.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#20

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 15:53
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;

Geändert von SneakyBagels ( 4. Jul 2017 um 15:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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