2010-11-16 10 views
12

OK, me pilló algo que parece un poco raro. Me doy cuenta de que fue un error no formatear correctamente la ruta de acceso, pero esperaba que la siguiente prueba devolviera resultados falsos, especialmente porque la carpeta no existía.DirectoryExists ("c: temp \ foo") devuelve verdadero cuando el directorio no existe!

DirectoryExists("C:temp\\foo") 

pero de hecho, devuelve verdadero aunque el directorio no existe.

El código debe ser

DirectoryExists("C:\\temp\\foo") 

Puede alguien explicarme por qué me da un falso positivo de la primera versión? Esperaría que sea falso o arroje una excepción quizás, pero no sea cierto.

+1

¡Supongo que debería especificar que esto es C# bajo .NET! –

+5

¿Qué es 'DirectoryExists'? Esa no es una función de biblioteca .NET estándar. Podría ser 'Directory.Exists (path)', pero no existe la función 'DirectoryExists'. –

+1

No veo ninguna razón para que vuelva ** verdadero **. Tengo curiosidad por eso. Por cierto, en caso de que no lo sepas, también puedes escribir 'Directory.Exists (@" C: \ temp \ foo ");' mientras te deshaces de las secuencias de escape. –

Respuesta

21

Esta API se comporta correctamente, pero a menudo parece incorrecta la primera vez que se encuentra con este comportamiento. Omitir el \ después de que la letra del volumen tenga una semántica especial. Reemplazará el especificador de volumen con el valor pasado a la última llamada al SetCurrentDirectory para ese volumen. Cómo este se recuerda que se discute aquí

En este caso, el último valor pasado era o c:\ o el directorio actual simplemente no se había establecido. De ahí la llamada realidad se convirtió en la segunda versión

Directory.Exists("c:\\temp\\foo") 

Este evaluado correctamente a cierto

Por qué esto sucede por Directory.Exists es que en el fondo, en el fondo de la función que utiliza GetFullPathName que se basa en este comportamiento (ver el ligado documentación).

+0

¡Pero el directorio no existía! (Por lo que puedo decir) Incluso si me "arregló" el volumen y el nombre de ruta, debería La razón por la que esto surgió fue porque el código creía erróneamente que existía un directorio cuando en realidad no existía. ¿Se puede vincular a dónde se explica esta semántica? No estoy seguro de haberlo obtenido aún. –

+0

Si hago un sandbox, se comporta como yo esperaba. Sin embargo, en mi código de producción, lo más probable es que obtenga un falso positivo porque el directorio actual da como resultado una condición donde el directorio en cuestión existe de alguna manera. –

Cuestiones relacionadas