在搜索所有子目录时,如何忽略拒绝访问?

时间:2015-10-21 06:22:14

标签: c# .net winforms

My first string My second string My last string;

在这种情况下,我在c:\中搜索 因此一些目录被拒绝访问。我添加了try和catch但是现在这个方法有一个返回。

当它到达捕获区时,我应该如何或应该处理它? 我想最终获得所有子目录的列表,这样我就可以获得所有子目录名称和长度(子目录的数量)。

更新

我在类构造函数中尝试了这个:

static IEnumerable<string> GetSubdirectoriesContainingOnlyFiles(string path)
{
    try
    {
        return from subdirectory in Directory.GetDirectories(path, "*", SearchOption.AllDirectories)
               where Directory.GetDirectories(subdirectory).Length == 0
               select subdirectory;
    }
    catch
    {

    }
}

m_pars.SearchDir在其中包含C:\

然后在ApplyAllFiles中:

if (m_pars.SearchDir != null)
{
    ApplyAllFiles(m_pars.SearchDir,ProcessFile);
}

但List allsubdirs是空的。

1 个答案:

答案 0 :(得分:1)

您的问题可能是在递归访问其子目录之前,您没有访问(添加到列表中)当前目录。因此,如果您在那里获得例外,则不会向列表中添加任何内容。

以下适用于我。 (我还通过使用回调使其变得更通用,并使异常处理更加严格。)

class DirectoryHelper
{
    public static void Test()
    {
        DirectoryHelper.EnumerateSubDirectories(@"c:\windows\system32");
    }

    public static List<string> EnumerateSubDirectories(string path)
    {
        // Depending on your use case, it might be 
        // unecessary to save these in memory 
        List<string> allSubdirs = new List<string>();
        EnumerateSubDirectories(path,
            filePath => Console.WriteLine("Visited file: " + filePath),
            dirPath => allSubdirs.Add(dirPath),
            noAccessPath => Console.WriteLine("No access: " + noAccessPath)
        );
        return allSubdirs;
    }

    private static void EnumerateSubDirectories(string root, Action<string> fileAction, Action<string> subdirAction, Action<string> noAccessAction)
    {
        foreach (string file in Directory.GetFiles(root))
        {
            fileAction(file);
        }

        foreach (string dir in Directory.GetDirectories(root))
        {
            try
            {
                subdirAction(dir);
                EnumerateSubDirectories(dir, fileAction, subdirAction, noAccessAction);
            }
            catch (UnauthorizedAccessException)
            {
                noAccessAction(dir);
            }
        }
    }
}