2009-09-18 12 views
30

En C#, System.IO.File.Delete (filePath) eliminará el archivo especificado o generará una excepción. Si el usuario actual no tiene permiso para eliminar el archivo, generará una excepción de acceso no autorizado.¿Cómo puedo comprobar si File.Delete() tendrá éxito sin intentarlo, en C#?

¿Hay alguna manera de que yo puedo decir de antemano si la eliminación es probable que lanzar una UnauthorizedAccessException o no (es decir, consultar la ACL para ver si la identidad del subproceso actual tiene permiso para borrar el archivo especificado?)

básicamente estoy buscando hacer:

if (FileIsDeletableByCurrentUser(filePath)) { 
    /* remove supporting database records, etc. here */ 
    File.Delete(filePath); 
} 

pero no tengo ni idea de cómo poner en práctica FileIsDeletableByCurrentUser().

+17

Es bastante difícil manejar las condiciones de carrera. ¿Qué sucede si el archivo "era" eliminable en el momento en que está evaluando 'FileIsDeletableByCurrentUser' pero justo después de él, algún otro proceso bloquea el archivo? –

+1

Tampoco puede eliminar el archivo si lo abre otro proceso (como, por ejemplo, IIS u oficina). Puede ser la misma excepción pero no se puede decir simplemente mirando los permisos. – ryber

+2

¿Está seguro de que el solo hecho de utilizar un try/catch para las excepciones específicas no es la forma correcta de manejar esto? Parece que estás intentando reinventar la rueda aquí. – StingyJack

Respuesta

11
+0

Después de buscar la respuesta a esta misma pregunta varias veces a lo largo de los años, esta es la única solución que he visto que no utiliza un try/catch, por lo que técnicamente es la respuesta a la pregunta. Parece que hay mucho código para lo que se necesita hacer, pero está envuelto en una clase que se puede reutilizar en proyectos múltiples, esto es prometedor. – David

+0

Simplemente curioso: esto busca captar los permisos de acceso de archivos basados ​​en una cuenta de usuario. ¿Esto detectaría situaciones en las que otro proceso utiliza un archivo? – David

+0

¿Pero y si el archivo está abierto por otro proceso? Ver y verificar los permisos aún no garantiza al 100% que el archivo realmente se pueda eliminar. – Rippo

0

Por supuesto, puede consultar los indicadores de solo lectura usando System.IO y probablemente la seguridad de ACL en el archivo combinado con el usuario actual también, pero al igual que Mehrdad escribe en su comentario, nunca será a prueba en todos los casos. Por lo tanto, necesitaría el manejo de excepciones para el caso excepcional en todo momento (incluso si es solo a top-level catch-all, que registra/muestra un "problema inesperado" y mata su aplicación).

1

Como se indicó anteriormente. Busca los permisos del archivo y compáralos con el usuario que ejecuta la aplicación.

Siempre se puede utilizar este abordaje, así

bool deletemyfile() 
{ 
    try 
    { 
     ...delete my file 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

si devuelve falso sabes que falló si devuelve cierto, entonces .. funcionó y el archivo se ha ido. No estoy seguro de lo que busca exactamente, pero esto fue lo mejor que pude pensar

2

Estrictamente hablando, una excepción de acceso no autorizada significa que la ruta es un directorio, por lo que puede usar un tipo System.IO.Path.GetFileName (ruta) comando y atrapar el argumento de excepción.

Pero si desea una solución más integral, utilice System.IO.File.GetAccessControl como se ha mencionado por Dale Halliwell

0

Debe obtener la lista de control de acceso (ACL) de ese archivo.

Pero esto no significa necesariamente que realmente podría eliminarlo porque todavía se puede establecer el indicador de solo lectura o si otro programa ha bloqueado el archivo.

0

parece que sería más fácil de hacer las cosas en el orden de:

  1. conseguir cualquier información que necesite sobre el archivo con el fin de hacer las otras partes (borrar datos de bases de datos, etc.)
  2. Try para eliminar el archivo
  3. Si elimina correctamente el archivo, realice el resto del trabajo de "limpieza". Si no lo elimina con éxito, devuelva/maneje la excepción, etc.
16

El problema con la implementación de FileIsDeletableByCurrentUser es que no es posible hacerlo.La razón es que el sistema de archivos es un elemento que cambia constantemente.

Entre cualquier comprobación que realice en el sistema de archivos y en la siguiente operación, cualquier cantidad de eventos puede ocurrir y sucederá. Incluyendo ...

  • permisos en el archivo podría cambiar
  • El archivo se ha podido eliminar
  • El archivo puede ser bloqueado por otro usuario/proceso
  • La llave USB el archivo está en podría ser eliminado

La mejor función que podría escribir se llamaría más acertadamente FileWasDeletableByCurrentUser.

+1

Votado porque el nombre de función que se propone es a la vez humorístico y perspicaz. –

Cuestiones relacionadas