2009-10-21 51 views
4

我循环遍历一堆目录。其中一些(如D:\ $ RECYCLE.BIN \ S-1-5-20)给我一个System.UnauthorizedAccessException。我想我可以抓住它并继续前进,但我宁愿提前解决它。C#:如何检查我是否可以读取和/或删除目录

所以,当我有一个DirectoryInfo对象。我怎么看我是否被允许GetDirectories()和可能的Delete()呢?

回答

11

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

如果您执行检查后再删除(如果应该可以删除),则文件系统上存在竞争条件的可能性很小。这适用于大多数文件/目录访问操作。大多数文件系统操作被设计为原子性的,并且将该逻辑移入用户代码中会冲突这种原子性,并且还有一个仍需需要处理可能引发的异常。

+0

同意......再加上,在删除之前检查每个文件夹的删除权似乎是处理偶尔出现的异常情况(如果没有删除权限是例外而不是规则)。 – 2009-10-21 23:33:28

+0

问题是我首先得到目录,然后在所有这些目录上调用相同的方法。然后我检查目录是否为空,如果是,我尝试删除它。换句话说,它首先是读取,然后可能是删除,取决于目录是否仍为空。 – Svish 2009-10-21 23:36:05

+0

@pjabbott,我想这是一个很好的观点。也许我只会处理异常。一些我可能应该以任何方式... – Svish 2009-10-21 23:41:15

0

我相信你需要编写自己的GetDirectories()方法;那是递归地得到它里面的。

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

一旦你有你的目录列表,那么你就可以对其进行操作,一些MODS上面的方法应该保证你有读取列表中任何内容的权限。

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。

+1

我不与Windows安全工作了很多(好吧,根本没有),所以你可以详细说明我可以检查当前用户(WindowsIdentity.GetCurrent())是否可以删除目录中的文件?非常感谢您的帮助 – 2011-02-10 20:19:28

相关问题