Шаблон поиска Directory.GetFiles в Mono / OS X

1

Я пытаюсь получить все файлы, начинающиеся с определенного имени (без учета регистра).

Directory.GetFiles, похоже, чувствителен к регистру в OSX (но не в Windows), поэтому мне интересно, какие у меня параметры. Каталог может быть потенциально большой, поэтому получение всех файлов и фильтрация в памяти, вероятно, не самая лучшая идея.

Я использую Unity, у которого есть предварительная версия в формате pre 4.0, поэтому нельзя использовать EnumerateFiles.

Любые обходные пути?

  • 0
    Возможный дубликат Можете ли вы вызвать Directory.GetFiles () с несколькими фильтрами?
  • 1
    Нет, пожалуйста, внимательно прочитайте вопрос. Если я ищу что-то вроде бла-бла *, мне понадобятся все варианты (2 ^ x), чтобы перехватить все файлы.
Показать ещё 6 комментариев
Теги:
mono

1 ответ

0
Лучший ответ

ИМХО, связанный вопрос, который я предлагаю в качестве дубликата, должен быть достаточным. Но в интересах полноты и ясности, вот что я хочу сказать:

IEnumerable<string> EnumerateSpecificFiles(
    string directory, string initialTextForFileName)
{
    foreach (string file in Directory.EnumerateFiles(directory))
    {
        if (file.StartsWith(initialTextForFileName, StringComparison.OrdinalIgnoreCase))
        {
            yield return file;
        }
    }
}

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


РЕДАКТИРОВАТЬ:

Учитывая, что, как оказалось, вы используете более раннюю версию Mono, которая не включает метод Directory.EnumerateFiles(), ваш следующий лучший вариант - продолжить и реализовать этот метод самостоятельно, используя p/invoke (возможно, даже просто скопируйте реализацию из текущих источников Mono).

В качестве хака вы могли бы ограничить количество файлов, возвращаемых Directory.GetFiles(), применяя частичный фильтр. Например:

IEnumerable<string> EnumerateSpecificFiles(
    string directory, string initialTextForFileName)
{
    char[] initialCharacters =
        {
            char.ToLowerInvariant(initialTextForFileName[0]),
            char.ToUpperInvariant(initialTextForFileName[0])
        };

    foreach (char ch in initialCharacters)
    {
        foreach (string file in Directory.GetFiles(directory, ch + "*"))
        {
            if (file.StartsWith(initialTextForFileName, StringComparison.OrdinalIgnoreCase))
            {
                yield return file;
            }
        }
    }
}

Наконец, вы можете просто сразу получить все файлы в каталоге, используя метод Directory.GetFiles() и фильтрацию, как показано выше. Вы можете найти, что он работает достаточно хорошо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню