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

Ian*_*cer 9 c# filesystems ntfs

PathTooLongException当我访问对象的Fullname属性时,我的硬盘驱动器上有文件FileSystemInfo.有没有办法解决这个问题(不包括重命名不是一个选项的文件)?

其他答案提到的http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath建议在文件名上加上"\?\"前缀但在这种情况下DirectoryInfo.GetFileSystemInfos()是负责创建FileSystemInfo对象,DirectoryInfo不接受该前缀,因此无法使用它.

答案" C#代码中的PathTooLongException "没有帮助,因为这是一个多线程应用程序,我无法继续更改当前的应用程序路径.

我是否真的必须做所有事情PInvoke才能读取硬盘上的每个文件?

cam*_*dm9 5

从 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>
Run Code Online (Sandbox Code Playgroud)

此外,如果您的应用程序面向4.6.2 之前的.Net Framework 版本,则需要在 App.config 文件中添加一个部分:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅:
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 个字符)


Ian*_*cer 3

这看起来很有趣...... Codeplex Long Path Wrapper

长路径包装器提供的功能可以更轻松地处理长于 System.IO 命名空间当前 259 个字符限制的路径。使用长路径类,项目现在可以使用最多 32,000 个字符的路径。

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