C#:如何检查是否可以读取和/或删除目录

Svi*_*ish 5 c# directory access-control

我递归地遍历一堆目录.其中一些(如D:\ $ RECYCLE.BIN\S-1-5-20)给了我一个System.UnauthorizedAccessException.我想我可以抓住它并继续前进,但我宁愿提前弄明白.

所以,当我有一个DirectoryInfo对象时.我怎么能看到我是否被允许GetDirectories()并且可能被允许Delete()

小智 12

如果要删除它,请尝试删除它然后继续(根据需要处理异常).

如果你执行check-and-then-delete-if-be-able-to-delete,那么文件系统就有可能出现竞争条件,无论多么轻微.这适用于大多数文件/目录访问操作.大多数文件系统操作被设计为原子的,并将此逻辑移动到用户代码冲突这个原子性,并且仍然需要处理可能引发的异常.


Rub*_*ias 5

我构建了以下代码。请看看是否有帮助:

//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();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

D:\Projects\ConsoleApplication1\bin
    IdentityReference = BUILTIN\管理员
    InheritanceFlags = ContainerInherit、ObjectInherit
    传播标志 = 无
    访问控制类型 = 允许
    文件系统权限 = 完全控制

注意IdentityReferenceFileSystemRights属性;也许您应该在尝试删除目录之前针对它们测试当前的 ACL。