任何绕过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
只是为了能够读取硬盘上的每个文件吗?
从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