Llamando Directory.Exists ( “\\ server \ share \”) en el proyecto de instalación

StackOverflow https://stackoverflow.com/questions/554132

  •  23-08-2019
  •  | 
  •  

Pregunta

Tengo un proyecto de instalación de .NET a la que he añadido una acción instalador personalizado. Durante el proceso de configuración, el usuario tiene que proporcionar un camino (que a menudo es una ruta UNC) a un recurso compartido en su servidor de archivos. Yo intento hacer alguna validación antes de proceder para asegurarse de que el directorio existe, como tal:

if (!Directory.Exists(serverDirectory)) { 
    throw new InstallException("Specified path does not exist or ..."); 
} 

Pretty vainilla - y en una aplicación de consola, los Directory.Exists () código funciona como se esperaba. Sin embargo, en el contexto de la MSI, no lo hace. En concreto, la llamada a Directory.Exists siempre falla cuando se utiliza un recurso de red. La documentación de Directory.Exists Qué indica ¿Por qué :

  

El método no existe realizar la autenticación de red. Si consulta un recurso compartido de red existente sin ser previamente autenticado, el Exists método devolverá falso.

Búsquedas me han llevado a otros escenarios similares en ASP.NET donde suplantación es la solución. Eso no es aplicable en este caso, pero ilustra el problema.

¿Cómo puedo comprobar la existencia de la ruta de red? Para decirlo en el lenguaje de la documentación - ¿cómo preautenticar antes de la llamada? El usuario está instalando como un administrador, y navegando a esa ruta en el Explorador de Windows funciona con éxito, así que no es permisos del usuario, sino más bien una falta de comprobación por el código.

He creado una preocupación innecesaria - debería omitir este y lanzar la excepción más adelante cuando se trata de utilizar el recurso de la red ... es en gran medida el mismo fallo crítico, a la derecha

?
¿Fue útil?

Solución

No es sólo la existencia: es necesario comprobar los permisos, así, y se preocupan por lo que pasa si cambian en que en el período entre cuando se registre y cuando realmente utiliza el valor.

Por lo tanto el mecanismo normal es suponer simplemente que todo está bien. En su lugar, poner su esfuerzo de desarrollo en el manejo de la excepción cuando el supuesto resulta falsa, porque hay que ser capaz de hacer que la gracia de todos modos.

En este caso, es posible que pueda mejorar en que mediante la creación de inmediato un pequeño archivo de marcador de posición en el directorio en cuestión, y que mantiene un bloqueo en el archivo hasta que ha completado con la carpeta. Eso permitirá dar una mejor respuesta alguna, ya que obtendrá un error inmediata tratando de crear el archivo. También ayuda a garantizar que la carpeta permanece accesible, ya que bajo las ventanas, al menos, los usuarios tendrán dificultades para borrar o cambiar significativamente carpeta, siempre que ha obtenido un bloqueo a ese archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top