2010-03-09 10 views
7

У меня есть путь, и я хочу указать подкаталоги под ним, где каждый подкаталог не содержит другого каталога. (Только те подкаталоги, которые не содержат папок, но только файлы.)Получить все подкаталоги, содержащие только файлы

Любой разумный способ сделать это?

+3

Боюсь, я не понимаю бит в скобках вообще - не могли бы вы его переписать? –

ответ

21

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


static IEnumerable<string> GetSubdirectoriesContainingOnlyFiles(string path) 
{ 
    return from subdirectory in Directory.GetDirectories(path, "*", SearchOption.AllDirectories) 
     where Directory.GetDirectories(subdirectory).Length == 0 
     select subdirectory; 
} 
+0

Я знаю, что этот вопрос 3 года, но можете ли вы объяснить, как это работает? Поскольку это точный ответ, который я ищу. Я просто хочу убедиться, что я понимаю код. – webdad3

+0

В частности, часть .Length == 0. Как я должен это прочитать? – webdad3

+2

Для каталога без подкаталогов 'Directory.GetDirectories (подкаталог)' будет возвращать пустую строку ']', которая будет содержать 'Length'' 0'. Следовательно, мы выбираем только каталоги, которые соответствуют этому критерию, чтобы захватить каталоги, содержащие только файлы (возможно, и файлы). –

1

Вы можете использовать метод Directory.GetDirectories.

Однако я не уверен, что правильно понял ваш вопрос ... не могли бы вы уточнить?

16

DirectoryInfo

DirectoryInfo dInfo = new DirectoryInfo(<path to dir>); 
DirectoryInfo[] subdirs = dInfo.GetDirectories(); 
1

На основании ответа Håvard, но немного короче (и, возможно, немного легче читать, потому что он использует !Subdirs.Any() вместо Subdirs.Length == 0):

static IEnumerable<string> GetSubdirectoriesContainingOnlyFiles(string path) 
{ 
    return Directory.GetDirectories(path, "*", SearchOption.AllDirectories) 
      .Where(subdir => !Directory.GetDirectories(subdir).Any()); 
} 

Также обратите внимание, что для этого требуется using System.Linq; к поскольку он использует язык запросов LINQ. (И, конечно, using System.IO; для Directory класс :))