【发布时间】:2016-08-10 20:33:39
【问题描述】:
我在 Windows 上的 python 2.7.8 中使用 os.walk() 时遇到问题。
当我为它提供“正常”路径(例如 "D:\Test\master")时,它会按预期工作。但是,当我为它提供 UNC 路径(例如 "\\?\D:\Test\master")时,它会按预期报告根目录,但不会深入到子目录,也不会引发异常。
我的研究:我在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/*.*'
【问题讨论】:
-
您实际上可以发布自己问题的答案。 blog.stackoverflow.com/2011/07/…
-
\\?\前缀不是 UNC 路径。 UNC 路径(例如\\server\share)使用扩展路径前缀变为\\?\UNC\server\share。这个\\?\前缀绕过了正常的路径处理。 Windows 只是将它替换为 NT DOS 设备前缀\??\,它让对象管理器在登录会话 DOS 设备中搜索设备,然后搜索\Global??对象目录。这意味着\\?\路径必须是unicode字符串,因为 NT 路径是 Unicode,并且必须只使用反斜杠作为路径分隔符,因为正斜杠只是 NT 命名空间中的常规名称字符。 -
如果您使用
'//?/D:/Test/master',它不会绕过常规路径处理,并且路径仅限于MAX_PATH(260)个字符。使用u'\\\\?\\D:\\Test\\master'。 -
@eryksun - 这是正确的解决方案。我的代码都是 unicode,所以我认为这不是问题,但它通过套接字传输路径名,因此 unicode“格式”丢失了。接收端从套接字中获取字节并将它们放入默认编码的字符串中。我使用该字符串并将其用作顶部来遍历目录,但它失败了。转换为 unicode 并运行 walk 使其完美运行。 - 谢谢。