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

标签 python windows path

我想在 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 来启用系统的长路径支持。这允许在其 list 中声明支持长路径的应用程序使用内核支持的最大路径长度(大约 32,760 个字符,具体取决于最终解析的路径),甚至不需要“\\?\”前缀。 Python 3.6+ 表明支持长路径。

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

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

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


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

关于python - Windows 上 python 的长路径 - os.stat() 相对路径失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49054305/

相关文章:

php - Windows PHP Imagick 不工作

objective-c - 在 Windows 上为 ios 应用程序编译 objective-c 代码

java - 有什么方法可以读取java中导入项目的文件路径吗?

python - 从给定的二维方差创建二维高斯随机场

python - 返回列表的自定义 django 标签?

python - Openpyxl:似乎无法获得适合我想要做的事情的语法(向下阅读下一个单元格)

python - 如何使用python从mongoDB中的10亿个文档中获取随机单个文档?

c++ - 在 QT GUI 应用程序中切换窗口

python - 在 Windows 10 上安装 weasyprint 的问题

java - 从导出的 jar 获取路径不起作用