2011-01-05 3 views
0

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

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

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

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

+0

@Saeed жаль, что была просто опечатка в моем вопросе. Это была точка в моем исходном коде. – Earlz

ответ

3

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

string patter = "*.jpg|*.png|*.gif"; 
string[] filters = patter.Split('|'); 
foreach(string filter in filters) 
{ 
    // call Directory.GetFiles(path, filter) here; 
} 
+0

Это очень неэффективно. Вызовите Directory.GetFiles (путь) один раз и фильтруйте результаты с помощью LINQ или чего-то подобного – ppiotrowicz

+2

@ppiotrowicz: Как это неэффективно? Если вы используете подход LINQ, вы должны получить список всех файлов в каталоге, и это может быть очень длинный список. Используя этот подход, вы получаете только нужные записи. –

+1

@rune Это зависит, если GetFiles медленный из-за собственных вызовов Win32, он может быть быстрее, просто чтобы получить список ВСЕХ файлов и отфильтровать его в памяти. Это требует профилирования, хотя, чтобы точно убедиться, что быстрее. –

0

Это было ранее просил (https://stackoverflow.com/questions/163162) и раствор с помощью LINQ для фильтрации результатов было предложено

+0

Все еще ничего нового через 6 лет? –

1

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

string[] filters = new[]{"*.jpg", "*.png", "*.gif"}; 
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray(); 
Смежные вопросы