Я использовал следующий метод, который поддерживает *
whildcard. Вот алгоритм, он проверяет, содержит ли путь *
, затем с левой стороны от *
он получает последний \
и рассматривает левую часть \
как root для поиска.
Например, следующий поиск вернет все каталоги 2-го уровня глубины в c:\test
:
var result = GetDirectories("c:\test\*\*");
Вот функция:
string[] GetDirectories(string path)
{
var root = path;
if (root.IndexOf('*') > -1)
root = root.Substring(0, root.IndexOf('*'));
if (root.LastIndexOf('\\') > -1)
root = root.Substring(0, root.LastIndexOf('\\'));
var all = Directory.GetDirectories(root, @"*", SearchOption.AllDirectories);
var pattern = $"^{Regex.Escape(path).Replace("\\*", "[^\\\\]*")}$";
return all.Where(x => Regex.IsMatch(x, pattern, RegexOptions.IgnoreCase)).ToArray();
}
функция требует некоторой обработки исключений, например, для случаев, когда разрешенный root не существует. Но в моих тестах это работало хорошо для следующих примеров:
"c:\test\*"
→ Все каталоги в c:\test\
path "c:\test\a*"
→ Все a*
каталоги в c:\test\
путь "c:\test\a*\b*"
→ Все b*
каталоги в c:\test\a*
путь "c:\test\a*\b"
→ Все b
каталоги в c:\test\a*
путь "c:\test\*\*"
→ Все каталоги двухуровневой глубины под c:\test