C# 从PathTooLongException检索路径信息
我正在使用.Net 4.0中的DirectoryInfo和FileInfo枚举目录树中的文件,并点击PathTooLongException。简化版如下C# 从PathTooLongException检索路径信息,c#,.net,windows,path,pathtoolongexception,C#,.net,Windows,Path,Pathtoolongexception,我正在使用.Net 4.0中的DirectoryInfo和FileInfo枚举目录树中的文件,并点击PathTooLongException。简化版如下 公共静态类测试 { 公共静态无效搜索(DirectoryInfo库) { foreach(base.GetFiles()中的var文件) { 尝试 { Console.WriteLine(file.FullName); }捕获(PathToolOngEx异常) { //这是哪条路? } } foreach(base.GetDirectories
公共静态类测试
{
公共静态无效搜索(DirectoryInfo库)
{
foreach(base.GetFiles()中的var文件)
{
尝试
{
Console.WriteLine(file.FullName);
}捕获(PathToolOngEx异常)
{
//这是哪条路?
}
}
foreach(base.GetDirectories()中的var dir)
{
搜索(dir);
}
}
}
当抛出错误时,我想知道是什么文件路径导致了问题。显然,我不能要求全名,因为这是错误的。我可以从文件中获取名称。名称
,但如果我无法获取路径的其余部分,则作为文件。目录
会给出一个路径工具异常
,即使从中找到该文件的目录信息
工作正常!(但我不能使用它,因为实际的代码要复杂得多)
通过堆栈跟踪查看,它似乎使用了一个内部路径(我在debug中看到一个受保护的file.FullPath
),并试图从完整(超大)路径中删除目录。大多数问题似乎涉及到System.IO.Path.NormalizePath
,我听说在.NET4.0中进行了一些更改。我没有尝试过该框架的以前版本
我的问题是:
Andy除了使用反射,或者使用库或p/Invoke来使用支持长路径和手动检查长度的Windows API之外,我想不出任何其他方法。完整路径存储在名为
FullPath
foreach(var dir in new DirectoryInfo (@"D:\longpaths")
.GetFileSystemInfos("*.*", SearchOption.AllDirectories))
{
try
{
Console.WriteLine(dir.FullName);
}
catch (PathTooLongException)
{
FieldInfo fld = typeof(FileSystemInfo).GetField(
"FullPath",
BindingFlags.Instance |
BindingFlags.NonPublic);
Console.WriteLine(fld.GetValue(dir)); // outputs your long path
}
}
如果您试图对文件执行某些操作,而不仅仅是检查文件长度,我建议您使用像这样的库,但是它不会创建DirectoryInfos
,FileInfo
或FileSystemInfo
,只创建字符串。因此,它似乎并不能替代您的代码
至于你第二个问题的答案,我建议你阅读.NET中处理长路径的文章。这是一段引文,解释了为什么他们没有在.NET中快速添加长路径支持
很少有人抱怨32K的限制,所以,问题解决了吗?不完全是。过去我们不愿意添加长路径有几个原因,以及为什么我们仍然对此保持谨慎,这与安全性、Windows API中对\?\语法的不一致支持以及应用程序兼容性有关
这是一个由3部分组成的系列文章,解释了API之所以如此以及存在局限性的几个原因。感谢Christopher,我担心会出现这种情况。私自持有路径,不允许在未首先验证的情况下访问它,这似乎很愚蠢……尽管它为我创建了无效路径。您指向的
LongPath
库看起来很棒!不幸的是,我忘了提到所有的路径都是UNC的,所以现在还不能使用。查看代码以了解如何实现DirectAPI将非常有用。@Andyrooger,是的,我忘记了。我把代码分叉,并在不久前添加了它。你可以得到密码。使用源代码,而不是版本,我修复了一个愚蠢的错误。@ChristopherCurrens+1作为FieldInfo提示!