Pregunta

Recorro de forma recursiva en un grupo de directorios. Algunos de ellos (como D: \ $ RECYCLE.BIN \ S-1-5-20 ) me dan un System.UnauthorizedAccessException . Supongo que puedo atraparlo y seguir adelante, pero prefiero resolverlo con antelación.

Entonces, cuando tengo un objeto DirectoryInfo . ¿Cómo puedo ver si puedo GetDirectories () y posiblemente Delete () ?

¿Fue útil?

Solución

Si tiene la intención de eliminarlo, intente eliminarlo y luego continúe (administrando la excepción según corresponda).

Si realiza un check-and-then-delete-si-debería-ser-capaz-de-eliminar, existe la posibilidad de una condición de carrera en el sistema de archivos, aunque sea leve. Esto se aplica a la mayoría de las operaciones de acceso a archivos / directorios. La mayoría de las operaciones del sistema de archivos están diseñadas para ser atómicas y mover esta lógica a un código de usuario entra en conflicto con esta atomicidad y uno todavía necesita manejar una posible excepción que se está generando.

Otros consejos

Construí siguiendo el código. Por favor, vea si ayuda:

//using System.IO;
//using System.Security.AccessControl;
//using System.Security.Principal;

string[] directories = Directory.GetDirectories(
    Path.Combine(Environment.CurrentDirectory, @"..\.."), 
    "*", SearchOption.AllDirectories);
foreach (string directory in directories)
{
    DirectoryInfo info = new DirectoryInfo(directory);
    DirectorySecurity security = info.GetAccessControl();
    Console.WriteLine(info.FullName);
    foreach (FileSystemAccessRule rule in 
             security.GetAccessRules(true, true, typeof(NTAccount)))
    {
        Console.WriteLine("\tIdentityReference = {0}", rule.IdentityReference);
        Console.WriteLine("\tInheritanceFlags  = {0}", rule.InheritanceFlags );
        Console.WriteLine("\tPropagationFlags  = {0}", rule.PropagationFlags );
        Console.WriteLine("\tAccessControlType = {0}", rule.AccessControlType);
        Console.WriteLine("\tFileSystemRights  = {0}", rule.FileSystemRights );
        Console.WriteLine();
    }
}

Resultado:

D:\Projects\ConsoleApplication1\bin
    IdentityReference = BUILTIN\Administrators
    InheritanceFlags  = ContainerInherit, ObjectInherit
    PropagationFlags  = None
    AccessControlType = Allow
    FileSystemRights  = FullControl

Tenga en cuenta que las propiedades IdentityReference y FileSystemRights ; probablemente debería probar su ACL actual con ellos antes de intentar eliminar un directorio.

Creo que deberá escribir su propio método GetDirectories () ; que recursivamente consigue los que están dentro de él.

Este artículo de Microsoft tiene un buen artículo sobre cómo hacerlo, con un poco de trabaje, puede limpiarlo para usar las Listas genéricas y adaptarlo a su solución.

En pocas palabras, System.IO.Directory.GetDirectories () fallará cada vez que reciba una de esas excepciones.

El código más o menos así (copiado desde arriba) debería ayudarte a comenzar

    List<String> directories = new List<String>();
    void DirSearch(string sDir) 
    {
        try 
        {
            foreach (string d in Directory.GetDirectories(sDir)) 
            {
                //foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                //{
                //    
                //}
                // use this to search for files recursivly.
                directories.Add(d);
                DirSearch(d);
            }
        }
        catch (System.Exception excpt) 
        {
            Console.WriteLine(excpt.Message);
        }
    }

Una vez que tenga su lista de directorios, puede realizar operaciones en ellos, con algunos mods, el método anterior debería asegurarse de que tiene permisos de lectura en cualquier parte de la lista.

Encontré esto al intentar resolver el problema ...

Parece un código relacionado, pero sin mantenimiento, no lo probé

http: //technolog.nl/blogs/eprogrammer/archive/2009/06/18/Howto_3A00_-Properly-use-the-AccessCheck-API.aspx

saludos

Mario

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top