Windows上的python长路径 - os.stat()失败了相对路径?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows上的python长路径 - os.stat()失败了相对路径?相关的知识,希望对你有一定的参考价值。

我想在Windows上访问一些长UNC路径。我知道我需要使用"\?UNC"前缀(如果你逃避斜线,那就是"\\?\UNC\")。这工作正常:

os.stat('\\?\UNC\server.example.com\that\has\long\path\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.txt')
# works, returns os.stat_result

但是,它似乎失败了一个相对路径:

os.chdir('\\?\UNC\server.example.com\that\has\long\path')
os.getcwd()
# returns '\\?\UNC\server.example.com\that\has\long\path'
os.stat('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.txt')
# fails with [WinError 3] The system cannot find the path specified: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.txt'

这可能是Python中的一个错误,还是我的代码错了?

旁注 - 解决方法是os.stat(os.path.abspath('aaa\bbb.txt'))

答案

在Windows 10中,您可以通过在“HKLM System CurrentControlSet Control FileSystem”中设置名为“LongPathsEnabled”的DWORD来为系统启用长路径支持。这允许声明支持其清单中的长路径的应用程序使用内核支持的最大路径长度(大约32,760个字符,具体取决于最终解析的路径),甚至不需要“\?”前缀。 Python 3.6+表现为支持长路径。

也就是说,在Windows 10之前,工作目录和相对路径不能超过MAX_PATH(260)字符,其中包括尾部反斜杠和NUL终止符。目前的文件在这一点上具有误导性。显然有人在SetCurrentDirectory的文档中添加了免责声明“将此限制扩展到32,767个宽字符......”。不,没有延长限制。这就是它所说的circa 2016

进程的当前工作目录是DOS路径,而不是本机内核路径(*)。 DOS路径是任何非Unicode的路径,或使用正斜杠,DOS设备(例如逻辑驱动器号,CON,NUL等)或UNC语法。必须通过ntdll.dll中的运行时库函数将DOS路径转换为本机路径。如果长路径支持不可用,则此隐式转换仅限于最多MAX_PATH字符。

解决此问题需要使用以“\?”前缀开头的完全限定的Unicode路径。此前缀告诉运行时库绕过路径转换。相反,它只是将“\?”前缀替换为DOS设备链接的内核“ ?? ”虚拟目录,并且路径最终解析为真正的NT设备(例如“\? UNC”=>“ ?? UNC“=>” Device Mup“)。


(*)内核命名空间对所有内核对象使用单根树,而不仅仅是设备对象。它还有一种更可靠的处理相对路径的方法;看看RootDirectoryOBJECT_ATTRIBUTES场。

以上是关于Windows上的python长路径 - os.stat()失败了相对路径?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Python 在 Windows 上找到具有长名称的文件

在路径中找不到“dot.exe”。 Python 上的 Pydot (Windows 7)

windows路径太长无法删除

windows路径太长无法删除

Windows中删除路径太长目录及文件

node npm windows 文件路径太长无法安装包