2013-06-03 13 views
6

Delphi: Wie man Pfade über 255 Zeichen recurse und Dateiattribute liestWie kann man Pfade über 255 Zeichen zurücklesen und Dateiattribute lesen?

Ich schreibe eine Konsolenanwendung und muss eine Verzeichnisstruktur mit Pfaden viel größer als 255 Zeichen durchlaufen und dann Attribute der Dateien darin lesen.

Historisch habe ich Rekursion und FindFirst mit Turbo Delphi von 2006 verwendet, aber dies scheint über Pfade mit mehr als 255 Zeichen zu überspringen.

Kann ich die FindFirst() - Funktion für etwas anderes austauschen? Oder muss ich einen anderen Ansatz wählen?

+1

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. –

+0

@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. –

+1

@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? –

Antwort

8

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.

+0

Wie ich es gelesen habe, ist es eine Frage des Einwickelns meiner eigenen Funktion für ältere Versionen von Delphi um die Unicode-Funktionen oder die Verwendung einer neueren "Unicode" -Version. Wenn ich das letztere tun würde und nur neu kompiliert würde das funktionieren? – Tal

+0

Wenn Sie in einem Unicode-Delphi neu kompiliert und das magische Präfix hinzugefügt haben, erhalten Sie die Ergebnisse, nach denen Sie suchen. Das liegt daran, dass "FindFirst" den Parameter "Path" an "FindFirstFile" weiterleitet und Sie die Unicode-Version in Unicode Delphi erhalten. –