C#从DirectoryNotFoundException中获取目录名

本文关键字:获取 DirectoryNotFoundException | 更新日期: 2023-09-27 18:00:05

我制作了一个应用程序,用于搜索某些目录中的一些文件。当目录不存在时,它抛出DirectoryNotFoundException。我捕捉到了这个异常,但它没有DirectoryName属性或类似FileNotFoundException(FileName)的属性。如何从异常属性中找到目录名称?

C#从DirectoryNotFoundException中获取目录名

没有办法以本机方式实现这一点。

将此类添加到您的项目中:

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("'".", ""));
}

FileNotFoundException有文件名,但DirectoryNotFoundException没有目录名,这有点不一致,不是吗?

这里有一个解决方法:在抛出异常之前,使用exception的Data属性关联错误的目录名。

在尝试查找目录中的文件之前,请将目录名保存在变量中。然后为在该目录中查找的代码开始一个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.
}

首先用Directory检查它是否存在。存在

如果你只想在IDE中消除这个bug,那么你可以尝试这样做:

在Visual Studio中,转到Debug -> Exceptions,然后选中Common Language Runtime Exceptions对应的Thrown框。当异常发生时,这将带你直接进入异常,而不是等待被发现。

很抱歉翻到一篇旧帖子,但正如其他人所说,DirectoryNotFoundException没有将目录作为属性,而FileNotFoundException却有,这是非常愚蠢的。

我已经把它作为功能请求放进去了。NET:

http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4472498-directorynotfoundexception-should-expose-the-name-

从大多数Directory类方法抛出的DirectoryNotFoundException的Message成员的格式是"未找到目录'input'"。从该字符串中提取输入应该不难。

问你,如果你是用那个确切的参数调用方法的人,为什么你需要从异常中获取输入参数?