我递归地遍历一堆目录。其中一些(如D:\$RECYCLE.BIN\S-1-5-20)给我一个System.UnauthorizedAccessException
. 我想我可以抓住它并继续前进,但我宁愿提前弄清楚。
所以,当我有一个DirectoryInfo
对象时。我怎样才能看到我是否被允许GetDirectories()
并且可能Delete()
它?
我递归地遍历一堆目录。其中一些(如D:\$RECYCLE.BIN\S-1-5-20)给我一个System.UnauthorizedAccessException
. 我想我可以抓住它并继续前进,但我宁愿提前弄清楚。
所以,当我有一个DirectoryInfo
对象时。我怎样才能看到我是否被允许GetDirectories()
并且可能Delete()
它?
如果您打算删除它,请尝试将其删除,然后继续(适当处理异常)。
如果您执行检查然后删除,如果应该删除,则文件系统上可能会出现竞争条件,无论多么轻微。这适用于大多数文件/目录访问操作。大多数文件系统操作被设计为原子性的,并且将此逻辑移动到用户代码中会与这种原子性冲突,并且仍然需要处理可能引发的异常。
我构建了以下代码。请,看看它是否有帮助:
//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 = 无 AccessControlType = 允许 FileSystemRights = 完全控制
注意IdentityReference
和FileSystemRights
属性;可能您应该在尝试删除目录之前针对它们测试您当前的 ACL。
我相信您将需要编写自己的GetDirectories()
方法;递归地获取其中的内容。
这篇 Microsoft 文章有一篇很好的文章,介绍了如何做到这一点,通过一些工作,您可以清理它以使用通用列表并使其适合您的解决方案。
简而言之,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,上述方法应该确保你对列表中的任何内容都有读取权限。