C # получить имя каталога из DirectoryNotFoundException - PullRequest
8 голосов
/ 24 июня 2011

Я сделал приложение, которое ищет файлы в некоторых каталогах. Когда каталога нет, он выбрасывает DirectoryNotFoundException. Я ловлю это исключение, но у него нет свойства DirectoryName или чего-то подобного, например FileNotFoundException (FileName). Как я могу найти имя каталога из свойств исключений?

Ответы [ 8 ]

6 голосов
/ 24 июня 2011

Нет способа сделать это изначально.

Добавьте этот класс где-нибудь в свой проект:

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()); 
}   
5 голосов
/ 24 июня 2011

Это выглядит как хак, но вы можете извлечь путь из свойства 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("\".","")); 
 }
2 голосов
/ 24 июня 2011

Непосредственно перед попыткой найти файлы в каталоге сохраните имя каталога в переменной.Затем начните блок 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.
}
2 голосов
/ 24 июня 2011

Немного противоречиво, что FileNotFoundException имеет имя файла, но DirectoryNotFoundException не имеет имени каталога, не так ли?

Вот обходной путь: перед тем как выбросить исключение, свяжите ошибочное имя каталога, используя свойство Data исключения.

1 голос
/ 24 сентября 2013

Извините, что выкопал старый пост, но, как уже говорили другие, довольно глупо, что DirectoryNotFoundException не имеет каталог как свойство, когда FileNotFoundException делает.

Я поместил его как запрос функции для.NET:

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

1 голос
/ 24 июня 2011

Если вы хотите избавиться от этой ошибки в IDE, попробуйте сделать следующее:

В Visual Studio перейдите на Debug -> Exceptions, затем установите флажок Thrown для Common Language Runtime Exceptions. Когда это произойдет, вы получите право на исключение, вместо того, чтобы ждать, пока вас поймают.

1 голос
/ 24 июня 2011

Проверьте, что он существует первым с Directory.Exists

0 голосов
/ 24 июня 2011

Формат элемента Message для исключения DirectoryNotFoundException, генерируемого из большинства методов класса Directory, - «Вход« Directory »не найден». Не должно быть трудно извлечь ввод из этой строки.

Вопрос, зачем вам нужен входной параметр из исключения, если вы тот, кто вызывает метод с таким точным параметром?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...