先说我的结论:Windows 10 版本 1607 及更高版本系统就已经支持长路径了,系统虽然支持,但应用程序要使用长路径,依然要设置“启用 Win32 长路径”,原因参考 《在 Windows 10 版本 1607 及更高版本中启用长路径》,还有参考第3点的实际应用情况。
然后不用再怀疑你的操作系统是否支持长路径了,我之前就怀疑是否因为我的神州网信政府版原因,有限制不支持长路径呢?结果我在Windows server2019的资源管理器上也无法建立长路径,才继续深入找原因。
1、---起因--------------------------------------------------------------------------------
最近因为在编译python wheel 时,遇到了这样的错误信息:
creating C:\Users\Monday\AppData\Local\Temp\pip-install-4ls6iq2w\xformers_bcf4f67735df4e9aae791b64a7228251\build\temp.win-amd64-cpython-312\Release\Users\Monday\AppData\Local\Temp\pip-install-4ls6iq2w\xformers_bcf4f67735df4e9aae791b64a7228251\third_party\flash-attention\csrc\flash_attn\src
cl: 命令行 warning D9025 :正在重写“/D__CUDA_NO_HALF_OPERATORS__”(用“/U__CUDA_NO_HALF_OPERATORS__”)
fatal : Could not open output file C:\Users\Monday\AppData\Local\Temp\pip-install-4ls6iq2w\xformers_bcf4f67735df4e9aae791b64a7228251\build\temp.win-amd64-cpython-312\Release\Users\Monday\AppData\Local\Temp\pip-install-4ls6iq2w\xformers_bcf4f67735df4e9aae791b64a7228251\third_party\flash-attention\csrc\flash_attn\src\flash_bwd_hdim192_bf16_causal_sm80.obj.d
有网上说是因为Windows不支持长路径导致,根据网上关于如何启用Windows长路径支持,一顿猛操作,错误依然(其实应该是上面上一行的错误原因,导致文件没有创建而已,并不是长路径问题导致,而且第1行中建立长路径,也没有出错)。
2、---探索--------------------------------------------------------------------------------
于是我就想,我是不是可以手工试试是否支持长路径呢?
于是就在资源管理器里面建立长路径,咦,还真是建立不了哦,路径长度到达248个左右的字符长度后,便不能再建立路径了:

直到看了这篇文章《Even with LongPathsEnabled set to 1, Windows 10 Explorer doesn't seem to support long paths》 以及这篇文章《windows10操作系统文件名和路径名长度的严重问题》,并通过测试才发现,原来只是在Windows10的资源管理器里面无法建立长路径而已(资源管理器是能浏览长路径的)。通过支持长路径的应用,例如power shell等,是可以建立操作长路径的(路径长度达到了286个字符,可以更长):

而且无需运行 gpedit.msc 设置“启用 Win32 长路径” ,即是说系统已经支持长路径了。


在微软官网《在 Windows 10 版本 1607 及更高版本中启用长路径》中提到如下:
在 Windows 10 版本 1607 及更高版本中启用长路径
从 Windows 10 版本 1607 开始,许多常见的 Win32 文件和目录函数中删除了 MAX_PATH 限制。 但是,你的应用必须选择支持新行为。
要为每个应用程序启用新的长路径行为,必须满足两个条件。 必须设置注册表值,应用程序清单必须包含
longPathAware元素。用于启用长路径的注册表设置
重要
了解启用此注册表设置将只影响为利用新功能而修改的应用程序。 开发人员必须将其应用声明为可感知长路径,如以下应用程序清单设置中所述。 这不是将影响所有应用程序的更改。
注册表值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)必须存在并设置为1。 在首次调用受影响的 Win32 文件或目录函数后,系统(每个进程)将缓存此注册表值(请参见下面的函数列表)。 在进程的生存期内,将不会重新加载注册表值。 为了使系统上的所有应用都能识别该值,可能需要重新启动,因为某些进程可能在设置密钥之前已经启动。你还可以将此代码复制到一个可以为你设置此项的
.reg文件中,或者通过提升的特权在终端窗口中使用 PowerShell 命令:控制台复制
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] "LongPathsEnabled"=dword:00000001备注
还可以在
Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths中通过组策略控制此注册表设置。 还可以使用 策略配置服务提供程序(CSP)通过 Microsoft Intune 应用策略。应用程序清单会更新以声明长路径功能
应用程序清单还必须包含
longPathAware元素。XML复制
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings"> <ws2:longPathAware>true</ws2:longPathAware> </windowsSettings> </application>没有 MAX_PATH 限制的函数
如果你选择支持长路径行为,那么以下目录管理函数不再具有 MAX_PATH 限制:CreateDirectoryW、CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW。
如果你选择支持长路径行为,那么以下文件管理函数不再具有 MAX_PATH 限制:CopyFileW、CopyFile2、CopyFileExW、CreateFileW、CreateFile2、CreateHardLinkW、CreateSymbolicLinkW、DeleteFileW、 FindFirstFileW、FindFirstFileExW、FindNextFileW、GetFileAttributesW、GetFileAttributesExW、SetFileAttributesW、GetFullPathNameW、GetLongPathNameW、MoveFileW、MoveFileExW、MoveFileWithProgressW、ReplaceFileW、SearchPathW、FindFirstFileNameW、FindNextFileNameW、FindFirstStreamW、FindNextStreamW、GetCompressedFileSizeW、GetFinalPathNameByHandleW。
3、---设置启用长路径,编译告警消失,编译进行中--------


9万+

被折叠的 条评论
为什么被折叠?



