![]() |
Existenz langer Pfade
Hallo,
ich prüfe ob ein langer Pfad existiert mit:
Code:
Wenn Dirname ein Netzwerkpfad ist \\QNAP\abc ist funktioniert das nicht. Warum?
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; Beste Grüße |
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\. |
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 ![]() Die Antwort auf dein "Warum funktioniert das nicht?" ist dass du explizit nach lokal fragst. ![]() |
AW: Existenz langer Pfade
![]() 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: |
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:\ |
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 |
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. |
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 |
AW: Existenz langer Pfade
Also laut dieser Doku
![]()
Code:
\\?\UNC\QNAP\abc
|
AW: Existenz langer Pfade
Siehe:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 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