我有几次在不合时宜的时候遇到过这个问题:
尝试在具有深度路径的开源Java项目上工作 在源代码控制中存储深度fitness wiki树 试图使用Bazaar导入源代码控制树时出错
为什么会有这个限制?
为什么它还没有被移除?
您如何应对路径限制? 不,切换到Linux或Mac OS X并不是这个问题的有效答案;)
我有几次在不合时宜的时候遇到过这个问题:
尝试在具有深度路径的开源Java项目上工作 在源代码控制中存储深度fitness wiki树 试图使用Bazaar导入源代码控制树时出错
为什么会有这个限制?
为什么它还没有被移除?
您如何应对路径限制? 不,切换到Linux或Mac OS X并不是这个问题的有效答案;)
当前回答
这并不是严格意义上的,因为NTFS文件系统支持最多32k个字符的路径。你可以使用win32 api和“\\?”使用大于260个字符作为路径前缀。
. net BCL团队博客中关于漫长路径的详细解释。 一个小节选强调了长路径的问题
Another concern is inconsistent behavior that would result by exposing long path support. Long paths with the \\?\ prefix can be used in most of the file-related Windows APIs, but not all Windows APIs. For example, LoadLibrary, which maps a module into the address of the calling process, fails if the file name is longer than MAX_PATH. So this means MoveFile will let you move a DLL to a location such that its path is longer than 260 characters, but when you try to load the DLL, it would fail. There are similar examples throughout the Windows APIs; some workarounds exist, but they are on a case-by-case basis.
其他回答
至于为什么这个问题仍然存在——微软并不认为它是一个优先级,并且认为向后兼容性比改进他们的操作系统更重要(至少在这种情况下)。
我使用的一种变通方法是为路径中的目录使用“短名称”,而不是使用标准的、人类可读的版本。例如,对于C:\Program Files\,我会使用C:\PROGRA~1\你可以使用dir /x找到简短的等价名称。
您可以将文件夹作为驱动器挂载。从命令行,如果你有一个路径C:\path\to\long\文件夹,你可以将它映射到驱动器号X:使用:
subst x: \path\to\long\folder
它确实如此,而且出于某种原因,它是默认的,但你可以很容易地用这个注册表项覆盖它:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
参见:https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
这并不是严格意义上的,因为NTFS文件系统支持最多32k个字符的路径。你可以使用win32 api和“\\?”使用大于260个字符作为路径前缀。
. net BCL团队博客中关于漫长路径的详细解释。 一个小节选强调了长路径的问题
Another concern is inconsistent behavior that would result by exposing long path support. Long paths with the \\?\ prefix can be used in most of the file-related Windows APIs, but not all Windows APIs. For example, LoadLibrary, which maps a module into the address of the calling process, fails if the file name is longer than MAX_PATH. So this means MoveFile will let you move a DLL to a location such that its path is longer than 260 characters, but when you try to load the DLL, it would fail. There are similar examples throughout the Windows APIs; some workarounds exist, but they are on a case-by-case basis.
至于如何应对Windows上的路径大小限制,使用7zip来打包(和解包)路径长度敏感的文件似乎是一个可行的解决方案。我已经使用它传输了几个IDE安装(那些Eclipse插件路径,哎呀!)和大量自动生成的文档,到目前为止还没有遇到任何问题。
不知道它是如何逃避260字符限制设置由Windows(从技术PoV),但嘿,它工作!
更多细节在他们的SourceForge页面这里:
NTFS实际上可以支持多达32,000个字符的路径名 长度。” 7-zip也支持这样长的名称。 但它在SFX代码中被禁用。有些用户不喜欢长路径,因为 他们不知道如何和他们一起工作。这就是我这么做的原因 在SFX代码中禁用它。
发布说明:
9.32 alpha 2013-12-01 改进了对超过260个字符的文件路径名的支持。 4.44 beta 2007-01-20 7-Zip现在支持超过260个字符的文件路径名。
重要提示:为了使其正常工作,你需要直接在7zip“Extract”对话框中指定目标路径,而不是将文件拖放到预期的文件夹中。否则,“Temp”文件夹将被用作临时缓存,一旦Windows资源管理器开始将文件移动到“最终休息位置”,你就会陷入同样的260个字符限制。有关更多信息,请参阅对该问题的答复。