有时解决FileSystemInfo.Fullname抛出的PathTooLongException的方法吗?

时间:2011-08-22 20:54:35

标签: c# filesystems ntfs

当我访问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执行所有操作?

5 个答案:

答案 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。但是:

  • .NET框架类不支持长路径,因此您无法使用它们
  • 您需要为每个文件系统API函数编写一个包装器,以便它为本地和UNC路径使用正确的长路径

以下是有关长路径的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.I​O Library (V4.0) 。它承诺很长的路径名而不需要更改代码。但它似乎有一些问题。