您可以使用Linq进行筛选。
Regex regex = new Regex("your regex")
var directories = Directory.GetDirectories("c:\\", null, SearchOption.AllDirectories).Where(directory => regex.IsMatch(directory))
这种方法的缺点是它仍然会搜索被过滤掉的不想要的文件夹,因为
Where
出现在所有文件夹返回之后。这可以进行改进。
编辑
由于一旦您遇到没有权限的文件夹,就会抛出UnauthorizedAccessException异常,因此这将无法使用SearchOption.AllDirectories。
我认为您不能避免使用递归函数,因为需要检查UnauthorizedAccessException。
我使用Linq编写了这个方法,但与您自己的方法并没有太大区别。至少它检查了权限。它仍然容易出现StackOverflowException。
private static void Traverse(List<string> folders, string rootFolder, Regex filter)
{
try
{
new FileIOPermission(FileIOPermissionAccess.PathDiscovery, rootFolder).Demand();
Array.ForEach(Directory.GetDirectories(rootFolder),
(directory) =>
{
if (filter.IsMatch(directory))
{
folders.Add(directory);
Traverse(folders, directory, filter);
}
});
}
catch
{
}
}
List<string> folders = new List<string>();
Regex regex = new Regex("^.+$");
Traverse(folders, "e:\\projects", regex);