WindowsのPython 2.7.8でos.walk()
と問題があります。UNCパスを使用している場合、os.walk()はサブディレクトリを処理していません
"D:\Test\master"
などの「通常の」パスを入力すると、期待どおりに動作します。しかし、私は"\\?\D:\Test\master"
のようなUNCパスを提供すると、期待どおりにルートディレクトリを報告しますが、サブディレクトリにドリルダウンしたり、例外を発生させたりしません。
私の研究:help pageで、os.walk()
がエラーを処理するための関数引数を受け入れることを読んだ。デフォルトでは、この引数はNone
なので、エラーは報告されません。
私は単純な関数を渡してエラーを表示し、すべてのディレクトリに対して以下を受け取りました。
def WalkError(Error):
raise Exception(Error)
スタックトレース:(元々の質問に編集として掲載)原作者から
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/*.*'
あなたが実際にあなた自身の質問への答えを投稿することができます。 http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – Arthur2e5
'' \\?\ ''接頭辞はUNCパスではありません。 '\\ server \ share'のようなUNCパスは拡張パス接頭辞を使って' \\?\ UNC \ server \ share'になります。この '' \\?\ ''接頭辞は、通常のパス処理をバイパスします。 Windowsは単に、これをNT DOSデバイスの接頭辞 '' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ''で置き換えます。これは、ログオンセッションのDOSデバイス内のデバイスのオブジェクトマネージャー検索と '\ Global ??'これは、NTパスがUnicodeなので、 '\\?\' 'パスは' unicode'文字列でなければならないことを意味し、フォワードスラッシュはNT名前空間内の通常の名前文字に過ぎないのでパスの区切り文字としてバックスラッシュのみを使わなければなりません。 – eryksun
「//?/ D:/ Test/master」を使用すると、通常のパス処理をバイパスせず、パスは 'MAX_PATH'(260)文字に制限されます。 'u '\\\\?\\ D:\\ Test \\ master''を使用してください。 – eryksun