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

dro*_*dri 6 python windows

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

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

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

Ery*_*Sun 7

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

在Windows 10中,应用程序可以选择支持文件系统支持的最大长度的路径,而不需要"\\?\"前缀.但是,不要指望一切顺利.例如,从10.0.15063开始,CreateProcess如果工作目录超出,仍然会失败MAX_PATH.

IsLongPathAwareProcess进程环境块(PEB)中的标志启用了新行为.当且仅当"LongPathsEnabled"系统策略配置且"longPathAware"应用程序清单设置为true时,kernelbase.dll中的进程初始化代码才会启用此标志.有关更多信息,请参阅最大路径长度限制的结束.但是请注意,当它通过应用程序清单声明"还可以启用"新行为时,它是错误的(或措辞不当).必须启用这两个设置.

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
Run Code Online (Sandbox Code Playgroud)