Шаблон поиска System.IO.Directory работает не так, как ожидалось

#c# #.net

#c# #.net

Вопрос:

Я пытаюсь получить jpeg jpg файлы и, используя следующую инструкцию:

 string[] files = Directory.GetFiles(someDirectoryPath, "*.jp?g");
 

Документы MSDN для System.IO.Directory.Состояние GetFiles(строка, строка), ? представляющее «Ровно ноль или один символ»., Однако приведенный выше блок выбирает jpeg файлы, но опускает jpg файлы.

В настоящее время я использую шаблон поиска с чрезмерным разрешением "*.jp*g" для достижения своих результатов, но он морщит мой мозг, потому что он должен работать.

Ответ №1:

Из документов, на которые вы ссылались:

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

Я подозреваю, что это проблема. Честно говоря, я бы, вероятно, извлек все файлы, а затем обработал их в коде — это сделает код, о котором проще рассуждать, чем полагаться на странности обработки пути Windows.

Комментарии:

1. @svick: Согласен — но это показывает, что все это немного странно из-за количества символов в расширении. Вот почему я предложил вместо этого постобработку 🙂

2. AFAIK ? соответствует ровно одному символу и * соответствует чему угодно (включая нулевые символы )…

3. @Jon: Спасибо. Я постараюсь прочитать эти желтые заметки в будущем, а не предполагать рационального поведения. Еще раз спасибо.

Ответ №2:

Вы можете либо использовать "*" в качестве шаблона и обработать результат самостоятельно, ЛИБО использовать

 string[] files = Directory.GetFiles(someDirectoryPath, "*.jpg").Union (Directory.GetFiles(someDirectoryPath, "*.jpeg")).ToArray();
 

Согласно документам, используемый вами шаблон будет возвращать только файлы с расширениями длиной 4 символа.

Ссылка MSDN на Union