Получить файлы из каталога с шаблоном

Возможный дубликат:
Можете ли вы вызвать Directory.GetFiles() с несколькими фильтрами?

Можно ли получить за экс. .c а также .hфайлы из каталога. Использование Directory.GetFiles("C:\", ".c;.h"); не работает. Это слишком плохо, чтобы призвать Directory.GetFiles(...); дважды..:(

Благодарю.

6 ответов

Решение

Невозможно указать несколько фильтров в одном вызове метода GetFiles(). Вы можете найти альтернативы здесь

Если вы используете.NET 4.0, я бы пошел с Directory.EnumerateFiles:

var files = from f in Directory.EnumerateFiles("C:\\")
            where f.EndsWith(".c") || f.EndsWith(".h")
            select f;

Для.Net 3.5.

public IEnumerable<string> GetFiles(
     string basePath, 
     params string[] searchPatterns)
{
    if (searchPatterns == null || searchPatterns.Length == 0)
    {
        return Directory.GetFiles(basePath);
    }

    return Enumerable.SelectMany(searchPatterns, 
                         p => Directory.GetFiles(basePath, p));
}

Использование:

GetFiles(@"c:\", "*.c", "*.h");

Вы, вероятно, хотите добавить проверку

Вы можете попробовать что-то вроде этого:

 var query = from p in Directory.GetFiles(@"C:\").AsEnumerable()
                    where p.Contains(".c")
                    || p.Contains(".h")
                    select p;

См. Как получить файлы с несколькими расширениями, используя методы расширения.

Вот некоторые полезные вспомогательные функции для имитации наличия нескольких фильтров:

// .NET 4.0 friendly
public static IEnumerable<string> EnumerateFiles(string path, params string[] filters)
{
    return filters.Length == 0
        ? Directory.EnumerateFiles(path)
        : filters.SelectMany(filter => Directory.EnumerateFiles(path, filter));
}

// .NET 3.5 friendly
public static IEnumerable<string> GetFiles(string path, params string[] filters)
{
    return filters.Length == 0
        ? Directory.GetFiles(path)
        : filters.SelectMany(filter => Directory.GetFiles(path, filter));
}
Другие вопросы по тегам