Ich habe Probleme mit os.walk()
in Python 2.7.8 unter Windows.os.walk() verarbeitet keine Unterverzeichnisse bei Verwendung von UNC-Pfaden
Wenn ich es mit einem "normalen" Pfad wie "D:\Test\master"
liefern, funktioniert es wie erwartet. Wenn ich es jedoch mit einem UNC-Pfad wie "\\?\D:\Test\master"
versehe, wird es das Stammverzeichnis wie erwartet melden, aber es wird nicht in die Unterverzeichnisse gedrillt, noch löst es eine Ausnahme aus.
Meine Forschung: Ich las auf help page, dass os.walk()
ein Funktionsargument akzeptiert, um Fehler zu behandeln. Standardmäßig ist dieses Argument None
, daher wird kein Fehler gemeldet.
Ich habe eine einfache Funktion übergeben, um den Fehler zu drucken und erhielt für jedes Verzeichnis Folgendes.
def WalkError(Error):
raise Exception(Error)
Stapelüberwachung:
Traceback (most recent call last):
File "Compare.py", line 988, in StartServer
for root, dirs, files in os.walk(ROOT_DIR,True,WalkError):
File "C:\Program Files (x86)\Python2.7.8\lib\os.py", line 296, in walk
for x in walk(new_path, topdown, onerror, followlinks):
File "C:\Program Files (x86)\Python2.7.8\lib\os.py", line 281, in walk
onerror(err)
File "Compare.py", line 62, in WalkError
raise Exception(Error)
Exception: [Error 123] The filename, directory name, or volume label syntax is incorrect: '\\\\?\\D:\\Test\\master\\localization/*.*'
Sie tatsächlich eine Antwort auf Ihre eigene Frage veröffentlichen können. http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – Arthur2e5
Das '' \\? \ '' Präfix ist kein UNC-Pfad. Ein UNC-Pfad wie '\\ server \ share \ wird zu \\? \ UNC \ server \ share mit dem erweiterten Pfadpräfix. Dieses '' \\? \ "' Präfix umgeht die normale Pfadverarbeitung. Windows ersetzt es einfach durch das NT-DOS-Geräte-Präfix '' \ ?? \ '', bei dem der Objektmanager nach dem Gerät in den DOS-Geräten der Anmeldesitzung und dann nach dem Objektverzeichnis \ Global \ sucht. Das bedeutet, dass ein '' \\? \ '' - Pfad eine Unicode-Zeichenfolge sein muss, da NT-Pfade Unicode sind und nur den umgekehrten Schrägstrich als Pfadtrennzeichen verwenden müssen, da ein Schrägstrich nur ein normales Namenszeichen im NT-Namespace ist. – eryksun
Wenn Sie ''//?/D:/Test/master' verwenden, wird die normale Pfadverarbeitung nicht umgangen, und der Pfad ist auf' MAX_PATH' (260) begrenzt. Verwende 'u '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ – eryksun