Básicamente, me gustaría comprobar si tengo derechos para abrir el archivo antes de intentar abrirlo; No quiero usar un try / catch para esta comprobación a menos que sea necesario. ¿Existe alguna propiedad de acceso a archivos que pueda comprobar de antemano?
c#
.net
file-access
Horas
fuente
fuente
Respuestas:
He hecho esto innumerables veces en el pasado, y casi todas las veces que lo he hecho, me equivoqué al intentarlo.
Los permisos de los archivos (incluso la existencia de archivos) son volátiles : pueden cambiar en cualquier momento. Gracias a la Ley de Murphy, esto incluye especialmente el breve período entre el momento en que revisa el archivo y el momento en que intenta abrirlo. Es incluso más probable que se produzca un cambio si se encuentra en un área donde sabe que debe verificar primero. Sin embargo, por extraño que parezca, nunca sucederá en sus entornos de prueba o desarrollo, que tienden a ser bastante estáticos. Esto hace que el problema sea difícil de localizar más adelante y facilita que este tipo de error llegue a producción.
Lo que esto significa es que aún debe poder manejar la excepción si los permisos o la existencia del archivo son malos, a pesar de su verificación. Se requiere un código de manejo de excepciones , ya sea que verifique o no los permisos del archivo con anticipación. El código de manejo de excepciones proporciona toda la funcionalidad de las comprobaciones de existencia o permisos. Además, aunque se sabe que los controladores de excepciones como este son lentos, es importante recordar que la E / S del disco es aún más lenta ... mucho más lenta ... y llamar a la función .Exists () o verificar los permisos forzará un viaje adicional fuera del sistema de archivos.
En resumen, una verificación inicial antes de intentar abrir el archivo es redundante y un desperdicio. No hay ningún beneficio adicional sobre el manejo de excepciones, en realidad perjudicará, no ayudará, su rendimiento, agrega costos en términos de más código que debe mantenerse y puede introducir errores sutiles en su código. Simplemente no hay ninguna ventaja en hacer la verificación inicial. En cambio, lo correcto aquí es simplemente intentar abrir el archivo y esforzarse en un buen controlador de excepciones si falla. Lo mismo es cierto incluso si solo está comprobando si el archivo existe o no. Este razonamiento se aplica a cualquier recurso volátil.
fuente
Consejo rápido para cualquiera que venga aquí con un problema similar:
Tenga cuidado con las aplicaciones de sincronización web como DropBox. Acabo de pasar 2 horas pensando que la instrucción "using" (patrón Dispose) está rota en .NET.
Finalmente me di cuenta de que Dropbox lee y escribe archivos continuamente en segundo plano para sincronizarlos.
¿Adivina dónde se encuentra mi carpeta de proyectos de Visual Studio? Dentro de la carpeta "Mi Dropbox", por supuesto.
Por lo tanto, mientras ejecutaba mi aplicación en modo de depuración, DropBox también accedía continuamente a los archivos que estaba leyendo y escribiendo para sincronizarlos con el servidor de DropBox. Esto provocó los conflictos de bloqueo / acceso.
Entonces, al menos ahora sé que necesito una función de apertura de archivo más robusta (es decir, TryOpen () que hará varios intentos). Me sorprende que aún no sea una parte incorporada del marco.
[Actualizar]
Aquí está mi función de ayuda:
fuente
using
persona que llama tendría que usarlo ...using
no funcionará aquí. Al final del bloque de uso,fs
se forzará el cierre. ¡Le dará a la persona que llama un flujo de archivos CERRADO (tan inútil)!Aquí está la solución que busca
esto crea un nuevo permiso de lectura basado en la vista de la ruta de todos los archivos y luego verifica si es igual al acceso a los archivos leído.
fuente
Primero, lo que dijo Joel Coehoorn.
Además: debe examinar las suposiciones que subyacen a su deseo de evitar el uso de try / catch a menos que sea necesario. La razón típica para evitar la lógica que depende de excepciones (la creación de
Exception
objetos funciona mal) probablemente no sea relevante para el código que abre un archivo.Supongo que si está escribiendo un método que rellena un
List<FileStream>
archivo abriendo cada archivo en un subárbol de directorio y esperaba que una gran cantidad de ellos fueran inaccesibles, es posible que desee verificar los permisos de archivo antes de intentar abrir un archivo para que no lo haya hecho. obtener demasiadas excepciones. Pero aún manejarías la excepción. Además, probablemente haya algo terriblemente mal con el diseño de su programa si está escribiendo un método que hace esto.fuente
fuente
fuente
attempts
pasa por ref? Eso no tiene sentido. Tampoco prueba para en<=
lugar de solo==
.throw ex
es lo correcto .