列出与定义的路径模式匹配的所有文件夹

时间:2009-10-30 19:35:22

标签: .net

我需要对文件共享中与定义模式匹配的所有文件夹执行一些操作。该模式可以指树中的多个级别,例如, \Test\[a-z]+\Project[0-9]{3}

遍历树以查找所有匹配文件夹的最有效方法是什么?有没有比使用DirectoryInfo和di.GetDirectories()进行简单的递归深度优先搜索更好的方法,如下所示:

private void TraverseSubFolder(DirectoryInfo folder)
{
    if (filter.IsMatch(folder.FullName)) {
       DoStuff(folder);
    }

    DirectoryInfo[] subFolders = folder.GetDirectories();
    foreach (DirectoryInfo sf in subFolders)
    {
        TraverseSubFolder(sf);
    }
}

2 个答案:

答案 0 :(得分:4)

您可以使用Linq过滤

Regex regex = new Regex("your regex");
var directories = Directory.GetDirectories("c:\\", null, SearchOption.AllDirectories).Where(directory => regex.IsMatch(directory));

这种方法的缺点是它仍然会搜索被过滤掉的不需要的文件夹,因为在返回所有文件夹后发生Where

这可以改编。

修改

这对SearchOption.AllDirectories不起作用,因为只要你找到一个没有权利的文件夹,就会抛出UnauthorizedAccessException。

由于检查了UnauthorizedAccessException,我认为你不能没有递归函数。

我使用Linq编写了这种方法,但它与您自己的方法没有太大区别。至少它检查许可。它仍然容易出现StackOverflowException。

private static void Traverse(List<string> folders, string rootFolder, Regex filter)
{
    try
    {
        // Test for UnauthorizedAccessException
        new FileIOPermission(FileIOPermissionAccess.PathDiscovery, rootFolder).Demand();

        Array.ForEach(Directory.GetDirectories(rootFolder),
            (directory) =>
            {
                if (filter.IsMatch(directory))
                {
                    folders.Add(directory);

                    Traverse(folders, directory, filter);
                }
            });
    }
    catch 
    {
        // Ignore folder that we don't have access to
    }
}

// Usage example
List<string> folders = new List<string>();
Regex regex = new Regex("^.+$");
Traverse(folders, "e:\\projects", regex);

答案 1 :(得分:0)

Directory.GetDirectories(..,..,SearchOption.AllDirectories)