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

时间:2009-10-21 23:16:45

标签: c# access-control directory

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

所以,当我有一个DirectoryInfo对象时。如何才能看到我被允许GetDirectories()以及Delete()呢?

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:4)

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

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

结果:

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

请注意IdentityReferenceFileSystemRights属性;可能你应该在尝试删除目录之前测试你当前的ACL。

答案 2 :(得分:0)

我相信你需要编写自己的GetDirectories()方法; recursivly得到里面的那些。

This Microsoft Article有一篇关于如何做的很好的文章,通过一些工作你可以清理它以使用通用列表并使其适合你的解决方案。

简单地说,System.IO.Directory.GetDirectories()每次获得其中一个异常时都会失败。

大致相似的代码(从上面复制)应该让你开始

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

一旦你有了你的目录列表,你就可以对它们进行操作了,有了一些mod,上面的方法应该确保你对列表中的任何东西都有读权限。

答案 3 :(得分:0)

我在试图解决问题时发现了这个......

似乎相关,但相当无法维护的代码,我没有尝试过它

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

问候

马里奥