Domanda

Ricerco ripetutamente un mucchio di directory. Alcuni di loro (come D: \ $ RECYCLE.BIN \ S-1-5-20 ) mi danno un System.UnauthorizedAccessException . Suppongo che posso semplicemente prenderlo e andare avanti, ma preferirei capirlo in anticipo.

Quindi, quando ho un oggetto DirectoryInfo . Come posso vedere se mi è permesso GetDirectories () e possibilmente Delete () ?

È stato utile?

Soluzione

Se si intende eliminarlo, provare a eliminarlo e quindi procedere (gestendo l'eccezione nel modo appropriato).

Se si esegue un check-and-then-delete-if-dovrebbe-poter-essere-in grado di eliminare c'è la possibilità di una condizione di competizione sul filesystem, per quanto lieve. Questo vale per quasi tutte le operazioni di accesso a file / directory. La maggior parte delle operazioni del filesystem sono progettate per essere atomiche e spostare questa logica nel codice utente è in conflitto con questa atomicità e si dovrebbe ancora gestire una possibile eccezione sollevata.

Altri suggerimenti

Ho creato il seguente codice. Per favore, vedi se aiuta:

//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();
    }
}

Risultato:

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

Notare che le proprietà IdentityReference e FileSystemRights ; probabilmente dovresti testare il tuo ACL corrente contro di loro prima di provare a cancellare una directory.

Credo che dovrai scrivere il tuo metodo GetDirectories () ; che ricorsivamente ottiene quelli al suo interno.

Questo articolo Microsoft ha un buon articolo su come farlo, con un po 'di puoi pulirlo per utilizzare gli elenchi generici e adattarlo alla tua soluzione.

In poche parole, System.IO.Directory.GetDirectories () fallirà ogni volta che ottiene una di queste eccezioni.

Il codice approssimativamente come questo (copiato dall'alto) dovrebbe iniziare

    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 volta che hai il tuo elenco di directory, puoi quindi eseguire operazioni su di esse, con alcune mod il metodo sopra dovrebbe assicurarti di avere i permessi di lettura su qualsiasi cosa nell'elenco.

L'ho trovato mentre cercavo di risolvere il problema ...

Sembra un codice correlato, ma piuttosto non mantenuto, non l'ho provato

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

Per quanto riguarda

Mario

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top