我需要对文件共享中与定义模式匹配的所有文件夹执行一些操作。该模式可以指树中的多个级别,例如,
\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);
}
}
答案 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)