2009-07-21 11 views
9

Estoy recibiendo una excepción de acceso no autorizadoUnauthorizedAccessException intentar eliminar un archivo en una carpeta donde pueda eliminar otros archivos con el mismo código

  • en un archivo que puedo eliminar manualmente.
  • en una carpeta en la que soy capaz de eliminar por código otros archivos
  • y el archivo no está marcado como sólo lectura
  • además, yo estoy usando Windows XP en un PC independiente y no he asignado cualquier permiso a la carpeta o el archivo.
  • ningún otro proceso está utilizando el archivo

Si ayuda, este es el código en la que Provoca el rearranque de excepción:

protected void DeleteImage(string imageName) 
{ 
    if (imageName != null) 
    { 
     string f = String.Format("~/Images/{0}", imageName); 
     f = System.Web.Hosting.HostingEnvironment.MapPath(f); 
     if (File.Exists(f)) 
     { 
      if (f != null) File.Delete(f); 
     } 
    } 
} 

Por qué pudo suceder esto?

+0

Esto se siente como un problema de permisos. ¿Son los permisos de alguna manera diferentes en los archivos que puede eliminar en comparación con el que no puede? –

Respuesta

2

Si no es de solo lectura, es posible que esté siendo utilizado por otro proceso.

+2

No responde, mejor como comentario – Kiquenet

+0

@Kiquenet: ¿Por qué esto no sería una respuesta? De hecho, es lo que estaba sucediendo para mí. Solo que, de hecho, era el proceso en sí el que intentaba eliminarlo. (Hice referencia accidentalmente a un proyecto en mi script de actualización.) – teynon

0

Usted, el usuario humano, tiene un inicio de sesión con ciertos derechos. El servidor web puede tener un inicio de sesión diferente con diferentes derechos. Un usuario que comienza con IUSR_XXXX o algo por el estilo. Asegúrese de que el usuario tenga derechos sobre el directorio.

Sin más información sobre el contexto en el que está eliminando el archivo, supongo que el usuario del servidor web tiene diferentes derechos a un archivo que usted.

1

Comprobación de la primera obvio ...

Al abrir el fichero propiedad y echar un vistazo a la configuración de seguridad. ¿El usuario que ejecuta el código (es decir, si se trata de ASP.NET, Servicios de red/Cuenta de servicio de dominio) tiene acceso para eliminar realmente el archivo? Si no es así, cámbielo y vuelva a intentarlo.

¿Se está ejecutando como administrador al intentar eliminar esto manualmente? Si es así, entonces es probable que pueda eliminarlo manualmente. Intente eliminarlo como la cuenta que ejecuta su ASP.NET (supongo que es ASP.NET ya que está utilizando System.Web.Hosting.HostingEnvironment.MapPath).

Si ambas fallaron, intente ver si alguna otra proceso actualmente está usando este archivo. Una buena herramienta para averiguar es SysInternal Process Monitor. Filtrar por ruta que contiene su nombre de archivo y debe ver si algo está usándolo. Termine el proceso y vuelva a intentarlo.

+0

+1 para la herramienta sysinternal (hasta ahora, no sabía cómo usar ninguna de las herramientas sysinternal) – eKek0

+0

Intentar eliminar un archivo en uso arroja una Access Access no autorizada ? Esperaría otro tipo de excepción ya que no es un problema con los permisos. –

17

Me encontré con el mismo problema y descubrí que al escribir mi propio contenedor Directory.Delete lo solucioné. Esto es recursivo por defecto:

using System.IO; 

public void DeleteDirectory(string targetDir) 
{ 
    File.SetAttributes(targetDir, FileAttributes.Normal); 

    string[] files = Directory.GetFiles(targetDir); 
    string[] dirs = Directory.GetDirectories(targetDir); 

    foreach (string file in files) 
    { 
     File.SetAttributes(file, FileAttributes.Normal); 
     File.Delete(file); 
    } 

    foreach (string dir in dirs) 
    { 
     DeleteDirectory(dir); 
    } 

    Directory.Delete(targetDir, false); 
} 
+0

¿Qué es lo de http://caioproiete.net/es/csharp-delete-folder-including-its-sub-folders-and-files-even-if-marked-as-read-only/? – Kiquenet

+0

no estoy seguro de lo que quieres decir? Veo que es una función similar ... pero no exactamente igual ... Cuando usé esto antes, funcionó bien ... ¡ya pasó un tiempo! –

+2

gracias, resolvió mi problema –

6

Si el directorio contiene un archivo de solo lectura, no eliminará eso usando Directory.Delete. Es una implementación tonta de MS.

Me sorprende que nadie haya sugerido este método en Internet, que elimina el directorio sin recurrir a él y cambiando los atributos de cada archivo.Así es que:

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

(cambiar un poco para no disparar una ventana cmd momentáneamente, que está disponible en todo el Internet)

+0

No creo que sea tan tonto. Si la 'elimina' manualmente, en realidad la está moviendo a la Papelera de reciclaje. –

+1

@DaveVandenEynde depende, generalmente uso shift + del para eliminar archivos permanentemente. – Nothing4You

+0

Esta es la solución que he estado buscando, gracias – Juran

0

también me enfrenté el mismo problema pero con el tiempo se acercó con un enfoque genérico. A continuación están mis códigos.

String pathfile = "C: \ Users \ Public \ Documents \ Filepath.txt";

  if (!Directory.Exists(pathfile)) 
      { 
       File.SetAttributes(pathfile, FileAttributes.Normal); 
       File.Delete(pathfile); 
      } 


       using (FileStream fs = File.Create(pathfile)) 
       { 
        Byte[] info = new UTF8Encoding(true).GetBytes("What Ever Your Text is"); 

        fs.Write(info, 0, info.Length); 
        File.SetAttributes(pathfile, FileAttributes.ReadOnly); 

       } 
Cuestiones relacionadas