Frage

I Schleife durch ein Bündel von Verzeichnissen rekursiv. Einige von ihnen (wie D: \ $ RECYCLE.BIN \ S-1-5-20 ) geben Sie mir eine System.UnauthorizedAccessException. Ich nehme an, dass ich es einfach fangen und weitermachen, aber ich würde lieber das herauszufinden, im Voraus.

Also, wenn ich ein DirectoryInfo Objekt haben. Wie kann ich sehen, ob ich darf GetDirectories() und möglicherweise es Delete()?

War es hilfreich?

Lösung

Wenn Sie beabsichtigen, es zu löschen, versuchen, es zu löschen und dann weiter (Umgang mit der Ausnahme je nach Bedarf).

Wenn Sie ein ausführen Check-und-dann-löschen-if-sollte-sein-kann-zu-löschen gibt es die Möglichkeit einer Race-Bedingung auf dem Dateisystem, jedoch gering. Dies gilt für die meisten alle Datei- / Verzeichniszugriffsoperationen. Die meisten Dateisystem-Operationen sind so konzipiert, dass Atom- und bewegt diese Logik in Benutzercode in Konflikt steht diese Unteilbarkeit und man würde noch benötigen eine mögliche Ausnahme ausgelöst wird, zu behandeln.

Andere Tipps

ich folgenden Code gebaut. Bitte, sehen, ob es hilft:

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

Ergebnis:

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

Beachten Sie, dass IdentityReference und FileSystemRights Eigenschaften; wahrscheinlich sollten Sie Ihre aktuelle ACL gegen sie testen, bevor Sie versuchen, ein Verzeichnis zu löschen.

Ich glaube, Sie brauchen, um Ihre eigene GetDirectories() Methode zu schreiben; dass rekursiven bekommt die, die im Inneren.

Dieses Microsoft-Artikel einen guten Artikel hat, wie man es tun, mit einem wenig arbeiten Sie können es generische Listen zu verwenden, aufzuräumen und es Ihre Lösung fit machen.

Einfach ausgedrückt, System.IO.Directory.GetDirectories () wird jedes Mal scheitern sie eine dieser Ausnahmen wird.

-Code etwa wie folgt aus (von oben kopiert) sollten Sie den Start

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

Wenn Sie Ihre Liste der Verzeichnisse haben, können Sie dann Operationen an ihnen durchführen, mit einigen Mods das obige Verfahren sicherzustellen, sollten Sie die Berechtigungen für alles in der Liste gelesen haben.

Ich fand diese bei dem Versuch, das Problem zu lösen ...

Es scheint verwandt, aber ziemlich unmaintained Code, ich habe es nicht ausprobiert

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

Bezug

Mario

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top