C #: Come verificare se riesco a leggere e / o eliminare una directory
-
05-07-2019 - |
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 ()
?
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
Per quanto riguarda
Mario