Несколько фильтров с Directory.GetFiles?

Я пытаюсь использовать несколько фильтров с помощью команды Directory.GetFiles().

Итак, скажем, я хочу сопоставить файлы .html и .css. Я использую это:

Directory.GetFiles(path,"*.html|*.css");

Однако я не вижу никакой документации о том, что это поддерживается, и в конечном итоге это не соответствует ни файлам HTML, ни CSS. Есть что-то, что мне не хватает?


person Earlz    schedule 05.01.2011    source источник
comment
@ Саид, извините, это была просто опечатка в моем вопросе. Это была точка в моем исходном коде.   -  person Earlz    schedule 05.01.2011


Ответы (2)


Функция Directory.GetFiles не поддерживает несколько фильтров. Мое решение:

string patter = "*.jpg|*.png|*.gif";
string[] filters = patter.Split('|');
foreach(string filter in filters )
{
  // call Directory.GetFiles(path, filter) here;
}
person Andrei Schneider    schedule 05.01.2011
comment
Это очень неэффективно. Вызовите Directory.GetFiles(path) один раз и отфильтруйте результаты с помощью LINQ или чего-то подобного - person ppiotrowicz; 05.01.2011
comment
@ppiotrowicz: Как это неэффективно? Если вы используете подход LINQ, вы должны получить список всех файлов в каталоге, и это может быть очень длинный список. Используя этот подход, вы получаете только соответствующие записи. - person Rune Grimstad; 05.01.2011
comment
@rune это зависит от того, если GetFiles работает медленно из-за собственных вызовов Win32, он может быть быстрее, просто чтобы получить список ВСЕХ файлов и отфильтровать его в памяти. Однако требуется профилирование, чтобы точно увидеть, что быстрее. - person Pauli Østerø; 05.01.2011
comment
Это запускается из шаблона T4, поэтому это не имеет большого значения, если оно не очень медленное. - person Earlz; 05.01.2011
comment
@rune Это неэффективно, потому что вам все равно нужно просмотреть все файлы (несколько раз в вашем случае) и вам нужно удалить дубликаты (конечно, нет, если вы ищете по расширению). - person ppiotrowicz; 05.01.2011
comment
Я согласен с Паули в том, что необходимо профилировать, чтобы увидеть, что быстрее. Скорее всего, это зависит от количества файлов в папке и применяемого фильтра. Знаем ли мы, что GetFiles или что-то еще, что вызывает, не кэширует список файлов? Вот и спрашиваю :-) - person Rune Grimstad; 05.01.2011
comment
Мне нужно было сделать то же самое, в папке, которая возвращает чуть более 3000 файлов, предложенный метод занял 8 секунд, а фильтрация с использованием linq заняла 2 секунды. - person kay.one; 30.05.2011

Существует также решение для спуска, которое позволяет избежать циклов foreach (с помощью Linq):

string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();
person Bas1l    schedule 22.03.2013