Возврат списка имен каталогов (папок), которые соответствуют частичной строке - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужен кто-то, чтобы указать мне правильное направление.

Цель:
Вернуть список Имена папок по пути, содержащему строку в их имени. Например: путь имеет каталог с именами Pictures_New и Videos_New. Я ищу строку "Pictures_" и "Videos _".

Все это работает с одним строковым параметром, передаваемым в качестве строки поиска. Моя проблема - заставить его работать с несколькими фильтрами. Я знаю, что это легко сделать с помощью имен и расширений файлов.

Это передается GetFolders():

string[] filterStrings = { "Pictures_", "Videos_" }

Остальная часть моего кода:

public IEnumerable<string> GetFolders(string path, string[] filterStrings, SearchOption searchOption = SearchOption.AllDirectories)
{
    IEnumerable<string> folders = Directory.EnumerateDirectories(path, "Pictures_*.*", searchOption);
    var resultFolders = new List<string>();

    if(filterStrings.Length > 0)
    {
        foreach (var foldername in folders)
        {
            string folderName = Path.GetFileName(Path.GetDirectoryName(foldername));

            if (string.IsNullOrEmpty(folderName) || Array.IndexOf(filterStrings, "*" + folderName) < 0)
            {
                // This leaves us only with the Directory names. No paths.
                var b = (foldername.Substring(foldername.LastIndexOf(@"\") + 1));
                resultFolders.Add(b);
            }
        }
    }
    return resultFolders;
}

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

попробуй:

var patterns = new[] { "Pictures_*", "Videos_*" };
var dirsFound = new List<string>();
foreach (var dir in patterns.Select(pattern => Directory.GetDirectories(@"my path", pattern).ToArray()))
{
    dirsFound.AddRange(dir);
}
0 голосов
/ 25 апреля 2018

Вы можете использовать Linq SelectMany, чтобы проанализировать ваш список фильтров и вернуть список результатов с помощью Directory.GetDirectories();
Это, конечно, вернет все подкаталоги, которые соответствуют фильтру.Используйте только "*".

public IEnumerable<string> GetFolders(string path, string[] filterStrings, SearchOption searchOption = SearchOption.AllDirectories)
{
    List<string> resultFolders = filterStrings
                 .SelectMany(flt => Directory.GetDirectories(path, flt, searchOption))
                 .ToList();
    return resultFolders;
}
0 голосов
/ 25 апреля 2018

Похоже, вы не просматриваете каждую из строк фильтра:

var folders = new List<string>();
foreach (var filterString in filterStrings)
{
    folders.AddRange(Directory.EnumerateDirectories(path, filterString, searchOption););
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...