2011-06-23 19 views
8

Hice una aplicación que busca algunos archivos en algunos directorios. Cuando un directorio no está allí arroja el DirectoryNotFoundException. Capté esa excepción pero no tiene una propiedad DirectoryName o algo así como el FileNotFoundException (FileName). ¿Cómo puedo encontrar el nombre del directorio de las propiedades de la excepción?C# obtener el nombre del directorio de la excepción DirectoryNotFoundException

+0

El directorio no existe si recibiera la DirectoryNotFoundException, que sin duda no va a encontrar el nombre del directorio si el directorio no existe. ¿Estoy malentendiendo la pregunta, tal vez? – Caimen

+0

@Caimen: ¿Qué directorio no existe? – SLaks

+1

¿Desea el nombre que intentó encontrar? –

Respuesta

5

No hay forma de hacerlo de forma nativa.

Añadir esta clase en algún lugar para su proyecto:

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; 
    } 
} 

captura la excepción y el uso de la extensión del tipo de esta manera:

catch (DirectoryNotFoundException dnfe) 
{ 
    Console.WriteLine(dnfe.GetPath()); 
} 
+0

¡Gracias, funciona! – Sp3ct3R

+0

En mi caso, tuve que buscar comillas dobles: ex.Message.Split (new [] {'"', '\' '}) [1] – user1027167

2

Es un poco inconsistente que FileNotFoundException tenga el nombre de archivo, pero DirectoryNotFoundException no tiene el nombre del directorio, ¿no es así?

A continuación presentamos un resumen: Antes de lanzar la excepción, asocie el nombre del directorio errante usando la propiedad Data de Exception.

1

verifique que exista primero con Directory.Exists

+0

¿Qué pasa si no está en su código? Si él es el que intenta usar el directorio, probablemente ya tenga el nombre del directorio, por lo que es un punto discutible en primer lugar. –

2

Inmediatamente antes de tratar de encontrar archivos en un directorio, guardar el nombre del directorio en una variable. Luego comience un bloque de prueba para el código que se ve en ese directorio. Ahora tiene el nombre de directorio disponible si ese bloque de código arroja.

Por ejemplo:

// ... 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. 
} 
1

Si sólo está buscando a pisar este error en el IDE, entonces usted puede intentar hacer esto:

En Visual Studio, vaya a Debug -> Exceptions, a continuación, comprobar el Thrown caja para Common Language Runtime Exceptions. Esto te llevará a una excepción cuando ocurra, en lugar de esperar a que te atrapen.

4

Parece un truco, pero puede extraer la ruta desde la propiedad Message. En cuanto a mí, preferiría verificar la existencia del directorio primero usando el método 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("\".","")); 
} 
+0

Según http://msdn.microsoft.com/en-us/library/system.io.directorynotfoundexception.aspx, parece que la ruta aparece en la propiedad 'Mensaje'. – BinaryTox1n

+2

+1 - Yo llamaría a esto un truco, ya que sería un error si la aplicación se ejecuta en una cultura diferente. Sin embargo, esta sería una buena solución para cualquier ocasión en que la cultura se conozca de antemano. (Comprobar Directory.Exists es el peor truco, ya que puede fallar bajo cualquier circunstancia, lo que significa que hay dos condiciones de error diferentes para el mismo problema). –

+0

Tenga en cuenta que, en general, la forma correcta de registrar una excepción no es mediante el uso su mensaje, pero llamando 'Exception.ToString()' que contiene el mensaje más otra información útil. –

0

El formato del miembro Mensaje del DirectoryNotFoundException lanzada desde la mayoría Directorio métodos de clase es "Entrada de directorio 'no encontrado.". No debería ser difícil extraer la entrada de esta cadena.

Pregunta, ¿por qué necesitarías obtener el parámetro de entrada de la excepción si invocas el método con ese parámetro exacto?

Cuestiones relacionadas