c# - 有什么方法可以解决 FileSystemInfo.Fullname 有时抛出的 PathTooLongException?

标签 c# filesystems ntfs

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

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

答案“PathTooLongException in C# code”没有帮助,因为这是一个多线程应用程序,我无法继续更改当前应用程序路径。

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

最佳答案

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

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

为了将您的应用程序标记为“长路径感知”,请将此部分添加到您的 list 文件中:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
  </windowsSettings>
</application>

此外,如果您的应用程序以 早于 4.6.2 的 .Net 框架版本为目标,您需要在 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 个字符以内)

关于c# - 有什么方法可以解决 FileSystemInfo.Fullname 有时抛出的 PathTooLongException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153491/

相关文章:

c# - 如何在 web.config 之外安全地使用 ASP.NET 和 Azure 的凭据

c# - 使用 msbuildworkspace 打开解决方案会给出没有详细信息的诊断错误

r - R 中的文件锁

java - File.mkdir 不起作用,我不明白为什么

asp.net - IIS 7.5/ASP.NET - 匿名访问除一个目录之外的所有内容 - 如何?

database - FILESYSTEM 与 SQLITE,同时存储高达 10M 的文件

c# - WPF-- 同步动画

c# - 如何使用 WS-Security 并从 ASMX Web 服务访问 UsernameToken?

linux - Docker:安装/共享单个 sock 文件?

windows - NTFS 中的文件名存储为什么编码?