我制作了一个应用程序来搜索一些目录中的文件。当某个目录不存在时,它会抛出 DirectoryNotFoundException
异常。我捕获了这个异常,但它没有像 FileNotFoundException
(FileName)那样有 DirectoryName
属性或类似的东西。我该如何从异常属性中找到目录名称?
无法通过本地方式实现此操作。
在您的项目中添加此类:
public static class DirectoryNotFoundExceptionExtentions
{
public static string GetPath(this DirectoryNotFoundException dnfe)
{
System.Text.RegularExpressions.Regex pathMatcher = new System.Text.RegularExpressions.Regex(@"[^']+");
return pathMatcher.Matches(dnfe.Message)[1].Value;
}
}
catch (DirectoryNotFoundException dnfe)
{
Console.WriteLine(dnfe.GetPath());
}
看起来像是黑客攻击,但是你可以从 Message
属性中提取路径。就我而言,我更喜欢先使用 Directory.Exists
方法检查目录是否存在。
catch (DirectoryNotFoundException e)
{
// Result will be: Could not find a part of the path "C:\incorrect\path".
Console.WriteLine(e.Message);
// Result will be: C:\incorrect\path
Console.WriteLine(e.Message
.Replace("Could not find a part of the path \"", "")
.Replace("\".", ""));
}
Exception.ToString()
,其中包含消息和其他有用信息。 - Greg Jacksonthrow new DirectoryNotFoundException("Could not find directory name in string \"" + e.Message + "\"");
- Greg Jackson在尝试查找目录中的文件之前,将目录名称保存在一个变量中。然后为查找该目录的代码开始一个try块。这样,如果该代码块抛出异常,您现在可以使用该目录名称。
例如:
// ... somewhere in some method that's about to search a directory.
var dirName = directories[i]; // or something -- how do you get it before you pass it to DirectoryInfo?
try
{
SearchDirectory(dirName); // or a block of code that does the work
}
catch(Exception e)
{
// at this point, you know dirName. You can log it, add it to a list of erroring
// directories, or whatever. You could throw here, or swallow the error after logging it, etc.
}
有点不一致的是,FileNotFoundException
包含文件名,但是DirectoryNotFoundException
没有包含目录名,是吧?
这里有一个解决方法:在抛出异常之前,使用异常的Data
属性关联错误的目录名称。
首先使用Directory.Exists检查其是否存在
currentDirectory
的变量?如果找不到这个目录名,你可以从中获取名称。 - Tim Schmelter