C #: Wie kann man überprüfen, ob ich lesen kann und / oder ein Verzeichnis löschen
-
05-07-2019 - |
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()
?
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
Bezug
Mario