在一个python应用程序中,它必须与在Windows中运行的Python 2和Python 3兼容,我想知道是否已在系统中删除了Windows强加的260个字符路径长度限制。
最新的Windows可以禁用路径长度限制,甚至Python 3.6 Windows安装程序也允许自动执行此操作。但它也是用户在系统级别可以做的事情。此功能仅适用于NTFS文件系统。
我如何从我的python代码中知道是否启用了这个,所以我可以使用长路径或提供我自己的解决方法?可以检查给定单位,例如“C:/”或“D:/”。是否可以知道给定单位是否启用了长路径?
答案 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