当我访问PathTooLongException
对象的Fullname
属性时,我的硬盘上有文件抛出FileSystemInfo
。有没有办法解决这个问题(不包括重命名不是一个选项的文件)?
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath建议在文件名上加上“\?\”前缀,但在这种情况下,DirectoryInfo.GetFileSystemInfos()
负责创建FileSystemInfo
个对象和{{1不接受该前缀,因此无法使用它。
答案“PathTooLongException in C# code”没有帮助,因为这是一个多线程应用程序,我无法继续更改当前的应用程序路径。
为了能够读取硬盘上的每个文件,我是否真的必须使用DirectoryInfo
执行所有操作?
答案 0 :(得分:3)
这看起来很有意思...... Codeplex Long Path Wrapper
长路径包装器提供的功能使得更容易使用长度超过System.IO命名空间当前259字符限制的路径。使用长路径类,项目现在可以使用最多32,000个字符的路径。
我会尝试一下,虽然我立刻注意到它没有提供DirectoryInfo.GetFileSystemInfos()
的等效方法,因此需要进行一些修改。
答案 1 :(得分:2)
没有多少程序可以在大于259个字符的路径中存活。对于winapi层来说非常困难,MAX_PATH无处不在。它已被考虑用于.NET但没有具体的结果。博客文章系列ends here,其中包含指向底部先前条目的链接。
答案 2 :(得分:2)
正确地处理长路径并不困难 - 例如SetACL。但是:
以下是有关长路径的MSDN文档:http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx
答案 3 :(得分:2)
从Windows 10(或Windows Server 2016)和.Net 4.6.2开始,如果启用了注册表设置,则可以直接支持长路径,并且您的应用程序被标记为“长路径感知”。
可以通过本地组策略编辑器(gpedit.msc
)在计算机配置>下访问该设置。 管理模板> 所有设置> 启用Win32长路径
要将您的应用程序标记为“识别长路径”,请将此部分添加到清单文件中:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
此外,如果您的应用程序的目标是.Net框架早于4.6.2 的版本,则需要在App.config文件中添加一个部分:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime>
</configuration>
有关更多信息,请参阅:
https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
https://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx
(据我所知,这只会影响基本的Windows文件系统API。非文件系统API可能仍然限制为260个字符)
答案 4 :(得分:0)
对于.net 4.0,可以使用 Delimon.Win32.IO Library (V4.0) 。它承诺很长的路径名而不需要更改代码。但它似乎有一些问题。