2009-11-09 12 views
8

He buscado el SO pero no encuentro nada.Directory.Delete no funciona. Error de acceso denegado, pero en Windows Explorer está bien

¿Por qué esto no funciona?

Directory.Delete(@"E:\3\{90120000-001A-0000-0000-0000000FF1CE}-C"); 

Above line emitirá la excepción "Acceso denegado". Tengo los derechos de administrador y puedo eliminar el directorio con Explorer.

Parece que algunos caracteres prohibidos? pero Windows Explorer puede manejarlo. ¿Cómo puedo eliminar directorios con nombres como ese?

+2

¿El directorio está vacío? ¿Intentó "rastrear" con las herramientas sysinternal? – Arthur

+0

Sí, dir está vacío. No pensé en sysinternals. Thx, voy a intentar más pruebas pronto (pero tal vez alguien atrape "el error" antes). – binball

+3

¿No cree que el directorio es de solo lectura? Directory.Delete falla si lo es, independientemente de los permisos (ver parte inferior de http://msdn.microsoft.com/en-us/library/fxeahc5f.aspx) –

Respuesta

16

Gracias a todos por sus comentarios, que me ayuda en la búsqueda rápida de la solución.

Como Phil mencionado "Directory.Delete falla si lo es, independientemente de los permisos (ver parte inferior de msdn.microsoft.com/en-us/library/...)"

Además Unable to remove Read-Only attribute from folder Microsoft dice:

Es posible que no pueda eliminar el atributo de solo lectura de una carpeta con Windows Explorer. Además, algunos programas pueden mostrar mensajes de error cuando intenta guardar archivos en la carpeta.

Conclusión: Siempre retire todo dir, atributos de archivo diversa de lo normal antes de eliminar. Así que a continuación código de resolver el problema:

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\3\{90120000-0021-0000-0000-0000000FF1CE}-C1"); 

if (dir.Exists) 
{ 
    setAttributesNormal(dir); 
    dir.Delete(true); 
} 

. . . 

function setAttributesNormal(DirectoryInfo dir) { 
    foreach (var subDir in dir.GetDirectories()) 
     setAttributesNormal(subDir); 
    foreach (var file in dir.GetFiles()) 
    { 
     file.Attributes = FileAttributes.Normal; 
    } 
} 
+0

Obtengo 'acceso denegado' cuando intento esto. Mi aplicación llama a un proceso que crea un directorio. En una etapa posterior, necesito eliminar el directorio y obtengo 'acceso denegado'. Alguna solución? – rajkiran

+0

¡Éxito! cuando he añadido siguiente línea al final de la función 'setAttributesNormal':' dir.Attributes = FileAttribute.Normal' –

2

¿Ha intentado crear una nueva instancia de la clase DirectoryInfo y luego verificar que existe antes de la eliminación? El código se vería así:

 System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\3\{90120000-001A-0000-0000-0000000FF1CE}-C"); 
     if (dir.Exists) 
      dir.Delete(true); 

También, por favor verificar que usted (el usuario que ejecuta la aplicación) tiene acceso a la carpeta. Si se trata de una unidad asignada a la red, deberá poder ser eliminada por el usuario que ejecuta la aplicación.

Espero que esto ayude!

+0

Eso es lo que estaba haciendo, y no funcionó. –

2

Según el directorio en el que esté trabajando, es probable que necesite acceso de administrador para eliminar archivos. Para probar esto, ejecute su aplicación como administrador del explorador y vea si funciona (haga clic con el botón derecho en .exe y seleccione "Ejecutar como administrador").

Si eso funciona, necesitará obtener privilegios de administrador cuando se ejecute su aplicación. Puede hacer esto añadiendo lo siguiente a su manifiesto de aplicación:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
    <requestedPrivileges> 
     <requestedExecutionLevel level="requireAdministrator" /> 
    </requestedPrivileges> 
    </security> 
</trustInfo> 
+0

Esto no resuelve el problema, aunque generalmente lo hace por problemas de acceso. –

0

que tenía este síntoma, y ​​que en realidad era explorer.exe sí que estaba cerrando el directorio.He encontrado esto utilizando handle.exe, pero también se puede utilizar PowerShell para encontrar qué proceso está bloqueando el archivo:

$lockedFile = "C:\Windows\System32\wshtcpip.dll" 
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]"}}} 

A continuación, tiene que decidir si se debe tratar de detener ese proceso con gracia o no; sería fácil de modificar la secuencia de comandos PowerShell para tratar de interrumpir los procesos de bloqueo del archivo:

$lockedFile = "C:\directory_I_want_to_delete" 
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { write-host $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]" ; write-host "Killing process..." ; stop-process -pid $processVar.id -force }}} 
5

que utiliza el código de binball y ha añadido una línea para establecer los atributos del directorio a la normalidad también.

if (dir.Exists) 
    { 
     setAttributesNormal(dir); 
     dir.Delete(true); 
    }  

function setAttributesNormal(DirectoryInfo dir) 
    { 
     foreach (var subDir in dir.GetDirectories()) 
     { 
      setAttributesNormal(subDir); 
      subDir.Attributes = FileAttributes.Normal; 
     } 
     foreach (var file in dir.GetFiles()) 
     { 
      file.Attributes = FileAttributes.Normal; 
     } 
    } 
+0

me sale 'acceso denegado' cuando intento esto. Mi aplicación llama a un proceso que crea un directorio. En una etapa posterior, necesito eliminar el directorio y obtengo 'acceso denegado'. Alguna solución? – rajkiran

+0

Asegúrese de que el proceso no deje ninguna conexión abierta a los archivos, de lo contrario, se encontrará con problemas. Estoy seguro de que tiene el nivel correcto de acceso, al igual que el control total, etc ... – Chuck

+0

Yo sugeriría ya que esta es una operación recursiva de directorios debe mover el 'subDir.Attributes = FileAttributes.Normal' línea A finales de la función ya que también incluiría el directorio de destino y se ejecutaría recursivamente. – Jeremy

Cuestiones relacionadas