Wenn Sie Dateinamen mit \\?\
als Präfix angeben, aktivieren Sie die Parsing-Funktion für Pfadlängen mit erweiterter Länge und verlassen die Pfadbegrenzung von 260 Zeichen.
Damit dieses Präfix funktioniert, müssen Sie die Unicode-Versionen der Win32-API-Funktionen aufrufen. Wenn Sie also ein Unicode-Delphi verwenden, ist dies alles, was Sie tun müssen. Da Sie jedoch ein Delphi vor Unicode verwenden, müssen Sie Ihre eigene Version von FindFirst
erstellen, die Unicode-Versionen der API-Funktionen aufruft. Sie rufen FindFirstFileW
, FindNextFileW
, FindClose
und verwenden die Unicode-Version der Struktur, WIN32_FIND_DATAW
.
Diese Probleme werden ausführlich in MSDN: Naming Files, Paths, and Namespaces behandelt.
In Ihrem speziellen Szenario wird die Dokumentation für FindFirstFileW
ruft die Ausgabe wie folgt aus:
In der ANSI-Version dieser Funktion, der Name MAX_PATH Zeichen beschränkt ist. Um dieses Limit auf 32.767 Zeichen zu erweitern, rufen Sie die Unicode-Version der Funktion auf und fügen Sie "\? \" Dem Pfad voran.
Beachten Sie, dass die beiden Dateinamenfelder in WIN32_FIND_DATAW
in der Länge auf 260 Zeichen beschränkt sind. Das ist in Ordnung, weil sie nur den relativen Teil des Namens enthalten, also den Objektnamen relativ zum enthaltenden Verzeichnis. Sie müssen nur das Präfix \\?\
verwenden, wenn Sie FindFirstFileW
anrufen.
Um die Unicode-Version dieser API verwenden Sie ein WideString
für die lpFileName
Parameter von FindFirstFileW
und es PWideChar(FileName)
mit Pass verwenden werden.
var
FileName: WideString;
....
// initialise FileName, this will happen in your recursion
FindHandle := FindFirstFileW(PWideChar(FileName), FindData);
Was die Dateiattribute, können sie bei jeder Iteration lesen aus dem WIN32_FIND_DATAW
struct werden. Dieser Teil Ihres Codes muss sich nicht ändern. Die einzige Sache, die Sie beheben müssen, ist, das Parser des Charakters> 260 beim ersten Anruf zu FindFirstFileW
zu erhalten. Alles andere fließt ganz normal weiter.
Dies ist ein Duplikat von [Delphi - Wie überprüft man, ob eine Datei Pfad aus mehr als 255 Zeichen enthält] (http://stackoverflow.com/q/16874118/62576), außer dass man nach 'FileExists' fragt anstatt nach den Attributen . Die grundlegende Frage und ihre Antwort sind jedoch die gleichen. –
@KenWhite Diese Frage betrifft nicht wirklich Attribute. Sie werden aus der 'WIN32_FIND_DATAW'-Struktur ausgelesen. Das Problem ist nur der Aufruf von 'FindFirstFile', der aus dem 260 Zeichen-Limit ausbrechen muss. –
@David: All dies ist auch in Ihrer Antwort auf die vorherige Frage enthalten, einschließlich des Links "Naming Files" und der Erwähnung von A/W-Versionen. Inwiefern ist das anders? –