Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

tomkupitz 3. Jul 2017 19:50

Existenz langer Pfade
 
Hallo,

ich prüfe ob ein langer Pfad existiert mit:

Code:
function DirExists(const Dirname: string): Boolean;
var FindData: TWin32FindData;
    Handle: THandle;

begin
  Handle:=FindFirstFileW(PWideChar('\\?\'+Dirname+#0#0), FindData);

  if Handle<>INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);

    result:=FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0;
  end
  else
    result:=False;
end;
Wenn Dirname ein Netzwerkpfad ist \\QNAP\abc ist funktioniert das nicht. Warum?

Beste Grüße

SneakyBagels 3. Jul 2017 20:20

AW: Existenz langer Pfade
 
Ich kann das jetzt nicht testen und will mir ehrlich gesagt keinen Pfad >255 auf einem Netzlaufwerk anlegen.

-- das hier ist offensichtlich falsch, also weg damit --
Aber lasse die ersten zwei \\ deines Netzwerkpfades mal weg. Denn \\?\QNAP\ ist glaube ich zulässig, nicht aber \\?\\\QNAP\.

Der schöne Günther 3. Jul 2017 20:32

AW: Existenz langer Pfade
 
Ich verstehe nicht - Willst du überprüfen ob es ein "langer Pfad" ist, also länger ist als die Windows-Konstante "MAX_PATH"? Oder willst du wissen ob der Pfad in UNC-Notation (\\host\path) ist?

Für letzteren Fall: Nimm einfach TPath.IsUncPath()

Die Antwort auf dein "Warum funktioniert das nicht?" ist dass du explizit nach lokal fragst.
https://de.wikipedia.org/wiki/Uniform_Naming_Convention

p80286 3. Jul 2017 21:05

AW: Existenz langer Pfade
 
https://de.wikipedia.org/wiki/Uniform_Naming_Convention

Da steht eigentlich alles drin. Für die wikipedia-Hasser "\\?\" bezeichnet ein lokales Laufwerk. auch wenn man einen servernamen hinten dran hängt bleibt es lokal, da wird nichts draus.

Gruß
K-H

Ok vergiss es ich bin einen Hundespaziergang zu spät:oops:

SneakyBagels 3. Jul 2017 21:23

AW: Existenz langer Pfade
 
Ich schicke meine Pfade immer alle durch die erste Funktion. Bisher lief immer alles glatt. Vielleicht hilft das ja
Delphi-Quellcode:
function getUNCPath(aPath: string): string;
begin
 if not Winapi.ShLwApi.PathIsNetworkPath(PWideChar(aPath)) then
  if not System.IOUtils.TPath.IsUNCPath(aPath) then
   aPath := '\\?\' + aPath;

 Result := aPath;
end;

function removeUNCFromPath(aPath: string): string;
begin
 if not Winapi.ShLwApi.PathIsNetworkPath(PWideChar(aPath)) then
  if System.IOUtils.TPath.IsUNCPath(aPath) then
   Delete(aPath, 1, 4);

 Result := aPath;
end;

// Test
 ShowMessage( getUNCPath('Y:\') ); // Y = Netzlaufwerk. Resultat => Y:\
 ShowMessage( getUNCPath('C:\') ); // C = Systemlaufwerk. Resultat => \\?\C:\

tomkupitz 3. Jul 2017 21:40

AW: Existenz langer Pfade
 
Danke für die Hinweise.

Es geht um eine kleine Backupfunktion die Ordner in einen Zielordner kopiert. Quell- oder Zielordner können im Netzwerk liegen.
Nun kam es vor, dass einige Pfade in den Quellordnern größer als MAX_PATH wurden oder gar Dateinamen Überlänge hatten. D.h. es kam folglich dazu, dass Quell- und Zielordner nicht gleich waren. Kurz: Welche Möglichkeit habe ich ausser "\\?\" Dateien mit langen Pfaden oder Dateinamenüberlänge mit CopyFile zu kopieren?

Beste Grüße

SneakyBagels 3. Jul 2017 21:51

AW: Existenz langer Pfade
 
Ich stand mal vor demselben Problem wie du.
Kurz: außer \\?\ wird dir nicht viel übrig bleiben. Wenn es was anderes gibt, kenne ich es nicht.

Nutze einfach meine Funktion getUNCPath. Die macht aus allen Pfaden UNC-Pfade und wenn dein Pfad ein Netzwerkpfad ist, macht die Funktion nichts.

Dalai 4. Jul 2017 00:59

AW: Existenz langer Pfade
 
Es gibt noch ein anderes Prefix "\??\", das für Reparse Points verwendet wird. Leider habe ich mangels Verständnis des Themenkomplexes keine Ahnung, ob das vielleicht auch für UNC funktioniert. Vielleicht einen Versuch wert?

Grüße
Dalai

samso 4. Jul 2017 11:40

AW: Existenz langer Pfade
 
Also laut dieser Doku https://msdn.microsoft.com/en-us/lib...).aspx#maxpath sollte es möglich sein, das wie folgt zu schreiben:

Code:
\\?\UNC\QNAP\abc

SneakyBagels 4. Jul 2017 11:53

AW: Existenz langer Pfade
 
Siehe:

Zitat:

Zitat von Der schöne Günther (Beitrag 1375880)
Ich verstehe nicht - Willst du überprüfen ob es ein "langer Pfad" ist, also länger ist als die Windows-Konstante "MAX_PATH"? Oder willst du wissen ob der Pfad in UNC-Notation (\\host\path) ist?

Für letzteren Fall: Nimm einfach TPath.IsUncPath()

Die Antwort auf dein "Warum funktioniert das nicht?" ist dass du explizit nach lokal fragst.
https://de.wikipedia.org/wiki/Uniform_Naming_Convention



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Seite 1 von 3  1 23      

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