我在.NET 4.0中使用DirectoryInfo和FileInfo来枚举目录树中的文件,并且遇到PathTooLongException。简化版本低于从PathTooLongException中检索路径信息
public static class Test
{
public static void Search(DirectoryInfo base)
{
foreach(var file in base.GetFiles())
{
try
{
Console.WriteLine(file.FullName);
} catch(PathTooLongException ex)
{
// What path was this?
}
}
foreach(var dir in base.GetDirectories())
{
Search(dir);
}
}
}
当抛出的错误,我想知道是什么文件路径导致的问题。显然,我不能要求FullName
,因为这是错误的。我可以从file.Name
得到名字,但是如果我无法得到路径的其余部分,因为file.Directory
给出PathTooLongException
,即使DirectoryInfo
该文件被发现工作正常! (我不能使用它,因为实际代码要复杂得多)。
通过堆栈跟踪看起来,它似乎正在使用一个内部路径(我看到从调试保护file.FullPath
),并试图从完整(超大)的路径撕裂目录。大部分问题似乎涉及System.IO.Path.NormalizePath
,我听说在.Net 4.0中经历了一些变化。我还没有尝试过这个框架的以前的版本。
我的问题:
- 我怎样才能得到这个异常的完整路径;它似乎通过了没有任何有用的信息。
- 为什么框架需要限制路径中的字符来切断文件名?
在此先感谢您的帮助,
安迪
谢谢克里斯托弗,我担心情况会如此。只是私下保留路径并且不允许在没有先验证它的情况下访问它,尽管它为我创建了无效路径就好了。 您指向的'LongPath'库看起来很棒!不幸的是,我忘了提及所有路径都是UNC,因此无法按原样使用(还)。通过代码来查看如何实现直接API会非常有用。 – Andyrooger 2012-03-07 09:49:35
@Andyrooger,是的,我忘了那个。我分叉了代码,并在不久前添加了该代码。你可以在codeplex项目中获得代码(http://longpaths.codeplex.com/)。使用源代码,而不是发行版,我修复了一个愚蠢的错误。 – 2012-03-07 21:01:29
@ChristopherCurrens +1 FieldInfo提示! – 2013-06-11 19:09:31