Конфигурация 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) для добавления дополнительных расширений. Это чище (я считаю, что это быстрее, хотя и не тестировалось) в целом. ИМО