GetFiles() - шаблон поиска

Я использую следующую строку для возврата определенных файлов...

FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)

Но есть и другие файлы в каталоге с расширением ".sbsar", и они тоже получают их. Как я могу различать ".sbs" и ".sbsar" в шаблоне поиска?

Ответ 1

Попробуйте это, отфильтрованный с помощью расширения файла.

  FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
            Where(f=>f.Extension==".sbs").ToArray<FileInfo>();

Ответ 2

Проблема, с которой вы столкнулись, - это ограничение шаблона поиска в Win32 API.

SearchPattern с расширением файла (например *.txt) точно три символа возвращают файлы с расширением из трех или более символы, где первые три символа соответствуют расширению файла указанном в searchPattern.

Мое решение - вручную фильтровать результаты, используя Linq:

nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"),
    StringComparison.InvariantCultureIgnoreCase));

Ответ 3

Что поведение API Win32 (FindFirstFile), находящегося под GetFiles(), отражается на вас.

Вам нужно будет сделать свою собственную фильтрацию, если вы должны использовать GetFiles(). Например:

GetFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));

Или более эффективно:

EnumerateFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));

Обратите внимание, что я использую StringComparison.InvariantCultureIgnoreCase, чтобы иметь дело с тем, что имена файлов Windows не зависят от регистра.

Если производительность является проблемой, то есть если поиск должен обрабатывать каталоги с большим количеством файлов, то более эффективно выполнять фильтрацию дважды: один раз в вызове GetFiles или EnumerateFiles и один раз для очистки нежелательных имен файлов. Например:

GetFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));
EnumerateFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));

Ответ 4

Он упоминается в docs

При использовании символа подстановки звездочки в searchPattern, searchPattern с расширением файла ровно три символа возвращает файлы с расширением из трех или более символов. используя знак подстановки знака вопроса, этот метод возвращает только файлы, соответствующие указанному расширению файла.