Ответ 1
Попробуйте это, отфильтрованный с помощью расширения файла.
FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
Where(f=>f.Extension==".sbs").ToArray<FileInfo>();
Я использую следующую строку для возврата определенных файлов...
FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)
Но есть и другие файлы в каталоге с расширением ".sbsar", и они тоже получают их. Как я могу различать ".sbs" и ".sbsar" в шаблоне поиска?
Попробуйте это, отфильтрованный с помощью расширения файла.
FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
Where(f=>f.Extension==".sbs").ToArray<FileInfo>();
Проблема, с которой вы столкнулись, - это ограничение шаблона поиска в Win32 API.
SearchPattern с расширением файла (например *.txt) точно три символа возвращают файлы с расширением из трех или более символы, где первые три символа соответствуют расширению файла указанном в searchPattern.
Мое решение - вручную фильтровать результаты, используя Linq:
nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"),
StringComparison.InvariantCultureIgnoreCase));
Что поведение 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));
Он упоминается в docs
При использовании символа подстановки звездочки в searchPattern, searchPattern с расширением файла ровно три символа возвращает файлы с расширением из трех или более символов. используя знак подстановки знака вопроса, этот метод возвращает только файлы, соответствующие указанному расширению файла.