2009-05-20 7 views
9

Estoy ejecutando Visual Studio 2008 en una caja Vista Ultimate. Cuando creo una nueva aplicación de consola y ejecuto el siguiente código a través del depurador, obtengo un resultado esperado: se lanza un UnauthorizedAccessException y no se crea el directorio.¿Por qué IO.Directory.CreateDirectory tiene éxito cuando no debería?

Sub Main() 
    Dim path = "C:\Windows\zzzz" 
    Try 
     IO.Directory.CreateDirectory(path) 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
    End Try 
    Console.WriteLine(IO.Directory.Exists(path).ToString) 
    Console.ReadLine() 
End Sub 

Cuando ejecuto este mismo trozo de código de mi solución de producción, el método es IO.Directory.CreateDirectory() no lanzar una excepción, IO.Directory.Exists() devuelve verdadero, y el directorio en realidad no se crea en el disco.

¿Hay alguna configuración de proyecto/solución que haría que el comportamiento de IO.Directory.CreateDirectory() varíe de esta manera?

Nota: Soy no se ejecuta Visual Studio como administrador en ambos casos.

EDITAR: La aplicación de producción se ejecuta en el mismo cuadro que la aplicación de prueba.

EDIT # 2: La aplicación de producción está utilizando la virtualización. Hice clic en Mi PC, navegué hacia C: \ Windows, y hice clic en "Archivos de compatibilidad" en la barra de herramientas del explorador y me llevó a C: \ Users \ myUser \ AppData \ Local \ VirtualStore \ Windows donde estaban sentados mis directorios creados.

La única pregunta pendiente es: ¿por qué la aplicación de producción se virtualiza mientras que la aplicación de la consola de prueba arroja una excepción?

Respuesta: la aplicación de la consola, por defecto, se creó con una aplicación.manifestación. La aplicación de producción, que es una aplicación WPF, no tenía una aplicación. Manifiesto. Aparentemente Vista usará virtualización si no hay una aplicación. Presente presente para el ejecutable.

¡Gracias a todos!

+0

Olvidó indicar si prod está ejecutando Vista también. – RichardOD

+0

¿Estás seguro de que el directorio no se crea? Intente crear manualmente un ARCHIVO llamado c: \ windows \ zzzz – RedFilter

Respuesta

13

Windows Vista le permite crear el directorio pero lo está almacenando en otro lugar. Solo la aplicación que lo creó puede ver en la ruta que especificó. Es por eso que Exists regresa verdadero.

Esto se puso para que las aplicaciones antiguas que intentaban guardar archivos en carpetas en las que no había permisos no fallaran. La mayoría de las personas se topan con esto con las aplicaciones heredadas que intentan guardar sus archivos en el directorio de archivos del programa.

Esto se denomina virtualización y puede establecer un manifiesto que indique que no lo desea para su aplicación. Además, si ejecuta privilegios elevados, no se aplica (que no es su caso).

Esto también afecta el registro.

Puedes leer más al respecto here.

Aquí hay un reference de Microsoft.

+0

Esto tiene sentido. Pero, ¿qué hace que una aplicación virtualice la creación mientras que la otra lanza una excepción? –

+0

Interesante, no lo sabía. Tiene una referencia? – RedFilter

+0

Consulte el siguiente artículo de KB http://support.microsoft.com/kb/927387/EN-US/. –

0

Directory.CreateDirectory no arrojará una excepción si la carpeta ya existe, por lo que el comportamiento que está experimentando es correcto.

+0

Pero el archivo no existe antes de la primera llamada a IO.Directory.CreateDirectory, por lo que la primera llamada debería haber fallado. –

+1

Lo que quieres decir es que no parecía existir. :-) – RichardOD

Cuestiones relacionadas