任何绕过PathTooLongException的方法Fullname有时会抛出

本文关键字:Fullname PathTooLongException 方法 任何绕 | 更新日期: 2023-09-27 18:06:27

我的硬盘驱动器上有文件,当我访问FileSystemInfo对象的Fullname属性时抛出PathTooLongException。是否有任何方法来解决这个问题(不包括重命名文件,这不是一个选项)?

其他答案提到的

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath建议使用"'?"'"前缀在文件名上,但在这种情况下,DirectoryInfo.GetFileSystemInfos()负责创建FileSystemInfo对象,DirectoryInfo不接受该前缀,所以没有办法使用它。

答案"c#代码中的PathTooLongException"没有帮助,因为这是一个多线程应用程序,我不能不断更改当前应用程序的路径。

我真的要做一切与PInvoke只是为了能够读取硬盘上的每个文件吗?

任何绕过PathTooLongException的方法Fullname有时会抛出

从Windows 10(或Windows Server 2016)和。net 4.6.2开始,如果注册表设置被打开,并且你的应用程序被标记为"长路径感知",则可以直接支持长路径。

设置可以通过本地组策略编辑器(gpedit.msc)访问,在计算机配置>管理模板>所有设置>启用Win32长路径

为了将你的应用程序标记为"长路径感知",将这一节添加到你的manifest文件中:

<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个字符)

这看起来很有趣…Codeplex长路径包装器

长路径包装器提供了一些功能,可以更容易地处理长度超过当前系统的259个字符限制的路径。IO命名空间。使用长路径类,项目现在可以使用最多32,000个字符的路径。

我将尝试一下,尽管我立即注意到它没有提供与DirectoryInfo.GetFileSystemInfos()等效的方法,因此需要进行一些修改。

没有多少程序可以在大于259个字符的路径中存活。对于winapi层来说,这是一个很硬的限制,MAX_PATH无处不在。它已经被考虑用于。net,但没有具体的结果。

正确处理长路径并不那么困难,例如SetACL就做到了。但是:

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

以下是MSDN上关于长路径的文档:http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx