Конфигурация SearchPattern в EnumerateFiles

У меня есть каталог с 2 файлами:

  • file1.в XLS
  • file2.XLSX-файл

Если я это сделаю:

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)

он возвращает оба файла, и я хочу только первый (file1.xls). Как я могу это сделать?

спасибо!

5 ответов


похоже, что под капотом,DirectoryInfo класс использует вызов Win32 FindFirstFile.

это только символы:

* любой символ

? чтобы соответствовать 0 или более символов - см. комментарии.

поэтому вам придется фильтровать результаты самостоятельно, возможно, используя следующее:

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
             .Where(fi => fi.Extension == ".xls");

Это на самом деле ожидаемое поведение. Это странно, но документально подтверждено.

On MSDN мы можем прочитать замечание:

при использовании подстановочного знака звездочки в searchPattern, например"*.txt", поведение соответствия, когда расширение имеет ровно три символа, отличается от того, когда расширение имеет более или менее трех символов. SearchPattern с расширением файла ровно три символа возвращает файлы, имеющие расширение трех или более символов, где первые три символа соответствуют расширению файла, указанному в searchPattern. SearchPattern с расширением файла один, два или более трех символов возвращает только файлы, имеющие расширения именно той длины, которые соответствуют расширению файла, указанного в searchPattern. При использовании подстановочного знака вопросительного знака этот метод возвращает только файлы, соответствующие указанному расширению файла. Например, учитывая два файла, " file1.txt " и "файл1.txtother", в каталоге, шаблон поиска " файл?.txt "возвращает только первый файл, а шаблон поиска" file*.txt " возвращает оба файла.


что-то вроде этого:

directoryInfo.EnumerateFiles(".xls",SearchOption.TopDirectoryOnly)
    .Where( f => Path.GetExtension( f ) == ".xls" );

можно использовать IEnumerable.First(), IEnumerable.FirstOrDefault() методы расширения , или, если шаблон важен, исправьте шаблон поиска перечисления.


это работает с помощью .Кроме () и должно быть быстрее:

   var dir = new DirectoryInfo(myFolderPath);
   ICollection<FileInfo> files = dir.EnumerateFiles("*.xls").Except(dir.EnumerateFiles("*.xls?")).ToList();

вы можете использовать Union(s) для добавления дополнительных расширений. Это чище (я считаю, что это быстрее, хотя и не тестировалось) в целом. ИМО