C # Поиск подкаталога (не для файлов) - PullRequest
8 голосов
/ 01 апреля 2010

Каждый пример, который я вижу для рекурсивного получения файлов в подкаталогах, использует только файлы. Я пытаюсь найти в папке определенный подкаталог с именем «xxx», а затем сохранить этот путь в переменной, чтобы я мог использовать его для других целей.

Возможно ли это без зацикливания всех каталогов и сравнения по имени?

Ответы [ 6 ]

11 голосов
/ 01 апреля 2010

Хорошо

Directory.GetDirectories(root);

вернет вам массив подкаталогов.

Затем вы можете использовать Linq, чтобы найти тот, который вас интересует:

IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test"));

, который не является циклом в вашем коде, но все же является циклом. Таким образом, окончательный ответ таков: «Нет, вы не можете найти папку« test »без циклов».

Вы можете добавить .SingleOrDefault() к Linq, но это будет зависеть от того, что вы хотите сделать, если ваша «тестовая» папка не будет найдена.

Если вы измените вызов GetDirectories, чтобы включить SearchOption SearchOption.AllDirectories, то он также сделает рекурсию для вас. Очевидно, что в этом случае вызов может вернуть более одного элемента, если в вашем дереве каталогов было несколько папок с именем «test».

7 голосов
/ 03 июня 2013
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories)

Это вернет строковый массив со всеми найденными папками с заданным именем. Вы можете изменить последний параметр, чтобы он проверял только каталоги верхнего уровня, и вы можете изменить корень, чтобы указать, откуда он начинается.

1 голос
/ 01 апреля 2010

Прежде всего, «Нет, это невозможно без перебора всех каталогов и сравнения по имени».

Я полагаю, что ваш реальный вопрос: «Существует ли существующий API, который будет обрабатывать циклы по всем каталогам и сравнивать по имени для меня?»

Да, есть. Это называется Directory.Exists():

var xxxPath = Path.Combine(parentFolder, "xxx");
if (Directory.Exists(xxxPath))
    savedPath = xxxPath;
0 голосов
/ 21 февраля 2018

Ниже приведен фрагмент для поиска папки с использованием двух фильтров при рассмотрении исключения UnauthorizedAccessException, для которого можно использовать только один фильтр:

public static string FindGitPath(string firstFilter, string secondFilter, string initialPath)
    {
        string gitPath = string.Empty;
        foreach (var i in Directory.GetDirectories(initialPath)) {          
            try {
                foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) {
                    foreach (var s in Directory.GetDirectories(f)) {
                        if (s == Path.Combine(f,secondFilter)) {
                            gitPath = f;
                            break;
                        }
                    }
                }       
            } catch (UnauthorizedAccessException) {
                Console.WriteLine("Path is not accessible: {0}", i);
            }                               
        }
        return gitPath; 
    }

Пример использования:

Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\"));
0 голосов
/ 01 апреля 2010

Вы можете использовать Windows Search, который также предоставляет API для .Net. Вот более подробная информация: Windows Search 4.0 для разработчиков

0 голосов
/ 01 апреля 2010

Да, я считаю, что единственное доступное решение (если не считать сторонних библиотек) - это рекурсивный поиск каталога с помощью сравнения имен.

...