Найти каталоги на заданном уровне глубины c с подстановочным знаком - PullRequest
0 голосов
/ 27 января 2020

У меня есть структура каталогов, подобная этой:

A: -
   B1 - C11 - D111 
        C12 - D121
              D122
   B2 - C21
        C22
        C23
        C24
   B3 - C31

Теперь, чтобы получить только каталоги 2-го уровня, в PowerShell это напрямую:

$LEVEL2 = get-childitem -Path 'A:\*\*'  | ?{ $_.PSIsContainer } 

Это даст мне:

C11, C12, C21, C22, C23, C24, C31

Теперь я хочу сделать это в c#. Кто-нибудь может помочь с этим?

Ответы [ 3 ]

2 голосов
/ 27 января 2020

Предполагая, что у вас есть System.Linq и System.IO в области видимости, самый простой способ будет:

Directory.EnumerateDirectories("A:\\").SelectMany(d => Directory.EnumerateDirectories(d))
1 голос
/ 27 января 2020

Я использовал следующий метод, который поддерживает * 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
0 голосов
/ 27 января 2020
class Program
{
   //Result Variable
    public static List<string> finalRes = new List<string>();
   //Level at which you want 
    public static int reqLevel = 3;

    static void Main(string[] args)
    {
        try
        {
            var path = @"D:\Personal\";
            GetFolederNames(path, 0);

        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }

    }

    public static void GetFolederNames(string path, int level)
    {

        var subDirs = new List<string>();
        subDirs = Directory.GetDirectories(path).ToList();
        if (level == reqLevel)
        {
            finalRes.Add(path);
            return;
        }
        foreach (var dir in subDirs)
        {
            if(finalRes.Contains(dir))
                continue;

            GetFolederNames(dir, level+1);
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...