如何从python中了解Windows路径限制是否已被删除

时间:2017-09-08 09:30:37

标签: python windows

在一个python应用程序中,它必须与在Windows中运行的Python 2和Python 3兼容,我想知道是否已在系统中删除了Windows强加的260个字符路径长度限制。

最新的Windows可以禁用路径长度限制,甚至Python 3.6 Windows安装程序也允许自动执行此操作。但它也是用户在系统级别可以做的事情。此功能仅适用于NTFS文件系统。

我如何从我的python代码中知道是否启用了这个,所以我可以使用长路径或提供我自己的解决方法?可以检查给定单位,例如“C:/”或“D:/”。是否可以知道给定单位是否启用了长路径?

1 个答案:

答案 0 :(得分:5)

历史上,长于MAX_PATH(260)的路径需要使用" \\?\"字首。此限制不是由NTFS等文件系统强加的。 Microsoft的file systems可以处理长达约32,760个字符的长路径。当系统运行时库将DOS路径(例如UNC路径,相对路径和带有DOS驱动器号的路径以及DOS设备(如COM1))规范化为本机OBJECT_ATTRIBUTES路径时,系统运行时库会强加限制。

在Windows 10中,应用程序可以选择支持文件系统支持的最大长度的路径,而不需要" \\?\"字首。但是,不要期待一切顺利。例如,自10.0.15063起,如果工作目录超过CreateProcess,则MAX_PATH仍会失败。

新行为由进程环境块(PEB)中的IsLongPathAwareProcess标志启用。 kernelbase.dll中的进程初始化代码启用此标志,当且仅当" LongPathsEnabled"系统策略已配置并且" longPathAware" application-manifest设置为true。有关详细信息,请参阅Maximum Path Length Limitation的结尾。但是请注意,当它声明一个"也可以启用"时,它是错误的(或措辞不当)。通过应用程序清单的新行为。必须启用这两个设置。

可以通过调用未记录的运行时库函数IsLongPathAwareProcess直接查询RtlAreLongPathsEnabled标志的值。例如:

import ctypes
ntdll = ctypes.WinDLL('ntdll')

if hasattr(ntdll, 'RtlAreLongPathsEnabled'):

    ntdll.RtlAreLongPathsEnabled.restype = ctypes.c_ubyte
    ntdll.RtlAreLongPathsEnabled.argtypes = ()

    def are_long_paths_enabled():
        return bool(ntdll.RtlAreLongPathsEnabled())

else:

    def are_long_paths_enabled():
        return False