2010-08-11 6 views
11

Obtengo un UnautorizedAccessException la ejecución de este código:Comprobación de acceso a archivos/carpetas permiso

string[] fileList = Directory.GetFiles(strDir, strExt); 

La excepción se da en c:\users\username\appdata ¿Cómo puedo comprobar si tengo permiso de acceso (a la lista y leer archivos)?

+0

ya tiene una forma de comprobar - GetFiles :) ¿Qué pasa con la captura? –

+4

Es lento cuando detecta excepciones. –

Respuesta

11

En primer lugar, me gustaría comprobar manualmente los permisos y ver lo que te bloquea y lo que no. Estoy usando algo como esto para comprobar si hay permisos (para el archivo de copia):

AuthorizationRuleCollection acl = fileSecurity.GetAccessRules(true, true,typeof(System.Security.Principal.SecurityIdentifier)); 
bool denyEdit = false; 
for (int x = 0; x < acl.Count; x++) 
{ 
    FileSystemAccessRule currentRule = (FileSystemAccessRule)acl[x]; 
    AccessControlType accessType = currentRule.AccessControlType; 
    //Copy file cannot be executed for "List Folder/Read Data" and "Read extended attributes" denied permission 
    if (accessType == AccessControlType.Deny && (currentRule.FileSystemRights & FileSystemRights.ListDirectory) == FileSystemRights.ListDirectory) 
    { 
     //we have deny copy - we can't copy the file 
     denyEdit = true; 
     break; 
    } 
... more checks 
} 

También, hay algunos casos raros donde un cierto derecho sobre la carpeta cambia el adecuado para los archivos independientemente de sus permisos individuales (voluntad ver si puedo encontrar lo que es).

5

Revise el artículo sobre el proyecto de código que es lo que necesita, la clase creada para esto: El propósito de esta clase es proporcionar una respuesta simple a una pregunta común: "¿Tengo permiso para leer o escribir esto? ¿archivo?".

A simple way to test individual access rights for a given file and user

Nota: no se puede publicar todo el código por aquí porque es demasiado larga.

+2

Ese ejemplo es cualquier cosa menos simple. – dahvyd

+0

@dahvyd: código de trabajo realmente rara vez lo es. –

+2

@Quandary, tendería a estar en desacuerdo en general, pero ese ejemplo específico hace cincuenta millones de cosas con código terrible, cuando el OP preguntaba por un requisito muy específico. Overkill en mi humilde opinión. – dahvyd

3

Primero, llame al Directory.GetFiles para el directorio raíz. Catch UnauthorizedAccessException - si no tiene ninguno, tiene acceso completo.

Si se detecta - llame a la función para cada subdirector recursivamente, capture la excepción, si se detecta - agregue dicho directorio a la lista.

escribir una función recursiva con la lista externa de directorios prohibidos

Cuestiones relacionadas