C# Directory.GetDirectories за исключением папок

Я пытаюсь перебрать список папок пользователей в окнах в "c:\Users", но исключаю встроенные пользовательские папки Microsoft, ниже приведен сегмент кода, который я использую для выполнения этого подвига, но по какой-то причине не работает, как задумано.

private readonly List<String> _exclusion = new List<String>
                                                   {
                                                       "All Users",
                                                       "Default",
                                                       "LocalService",
                                                       "Public",
                                                       "Administrator",
                                                       "Default User",
                                                       "NetworkService"
                                                   };

public static bool FoundInArray(List<string> arr, string target)
{
    return arr.Exists(p => p.Trim() == target);
}

foreach (string d in Directory.GetDirectories(sDir).Where(d => !FoundInArray(_exclusion,d)))
{
    richTextBox1.Text += d + Environment.Newline;
}

Я не уверен, почему это не работает, кто-нибудь может дать мне некоторое представление об этом?

2 ответа

Решение

В вашем лямбда-выражении: 'd' - это полное имя каталога (с путем), и, следовательно, на самом деле его нет в массиве.

Вы могли бы сделать:

public static bool FoundInArray(List<string> arr, string target)
{
    return arr.Any(p => new DirectoryInfo(target).Name == p);
}

Directory.GetDirectories() возвращает полный путь к каталогу, а не только последнюю часть каталога.

Хотя вы МОЖЕТЕ убрать последний компонент пути, возвращенного GetDirectories (), и сравнить его с тем, что в настоящее время находится в вашем массиве, это приведет к ложным и ложным отрицаниям.

Вместо этого используйте Environment.SpecialFolders, чтобы получить путь для определенной специальной папки, определенной для текущего пользователя и версии операционной системы.

private readonly List<String> _exclusion = new List<String>
{
    Environment.GetFolderPath(Environment.SpecialFolder.MyMusic),
    // etc.
}
Другие вопросы по тегам