2017-02-22 35 views
3

Предположим, у вас есть каталог, который содержит следующие каталоги.Directory.GetDirectories возвращает неправильные результаты с рисунком * *

dontgetme
get.me

Если вы используете следующий код :

string[] directories = Directory.GetDirectories(rootDirectory, "*.*", SearchOption.TopDirectoryOnly); 

Вы ожидали бы directories содержать:

get.me

Но он содержит оба каталога, почему это?

Оглядываясь в documentation, используются только подстановочные знаки * и ?, чтобы они не влияли на это.

Кроме того, если вы используете шаблон *., возвращается только каталог dontgetme; но используя *.*.*.* и т. д., оба они все еще возвращаются.


В случае, если это имеет значение, я использую .NET 4.6.1 и C# 6 на Windows, 10.

+1

имена файлов и каталогов Windows, всегда имеют расширение так '*. * 'Соответствует' anything', потому что он рассматривается как 'anything.' – DavidG

ответ

1

Причина этого сводится к решению о совместимости. В конечном итоге C# в конечном итоге вызовет метод Win32 FindFirstFile для выполнения поиска.

В этом я действительно нашел this answer, что объясняет это.

Я повторю цитату из этого ответа (взято из this blog post):

Например, если ваш шаблон заканчивается в .*, то .* игнорируется. Без этого правила шаблон . будет соответствовать только файлам, содержащим точку, которая могла бы сломать, вероятно, 90% всех пакетных файлов на планете, а также память мышц каждого человека, поскольку все, работающие под управлением Windows NT 3.1, выросли в мире, где *.* означало все файлы.

other answer к тому же вопросу также объясняет поведение с участием *. (курсив мой):

*.* соответствует все в целевом каталоге.

Это потому, что *. соответствует последнему периоду; если есть no период в имени, то это имя обрабатывается так, как если бы оно закончилось в течение периода; так *. соответствует только именам, начинающимся с периода и имен, не содержащих период (.afile/adirname), если вы добавите * в конец для *.*, то он также соответствует за последнему периоду, так что включает имена файлов, содержащие период, который охватывает все возможные файлы имена.

+0

Приятная находка, я предполагаю, что это итеративно, и это объясняет поведение '*. *. *. *. *'? На самом деле это не объясняет поведение '* .', хотя .... – TheLethalCoder

+0

Другой ответ объясняет поведение' * .' – TheLethalCoder

3

Вы образец означает "что-нибудь с любым расширением". No расширение «любое расширение», поэтому вы соответствуете всем четырем.

Вы можете попробовать ?*.?* в качестве шаблона, чтобы получить те, у которых есть как минимум один символ, как расширение, так и расширение и.

+0

Но, конечно, следует искать в буквальном' .' в имени? Или имена каталогов по существу 'yes.please.'? – TheLethalCoder

+0

когда-либо думал о '. \ Nope' как локальном имени этого каталога? – DarkSquirrel42

+1

На самом деле, я тоже начинаю сомневаться в собственном ответе, так как шаблон '*. *. *. *. *. *' Также будет соответствовать всем каталогам ... – DavidG

2

Имена файлов и каталогов Windows всегда имеют расширение, даже если оно пустое. Таким образом, *.* соответствует anything, так как обрабатывается как anything.

+0

Вы нашли что-нибудь лишнее об этом, особенно шаблоны '*. *. *. *. *. * ...'? – TheLethalCoder

+0

Я сейчас просто копаю, к сожалению, все это зарыто в Win32 API ... – DavidG

+0

Ответ от @Kyle указывает на дубликат, объясняющий это поведение, я отметил свой вопрос как обман. Спасибо за помощь. – TheLethalCoder

 Смежные вопросы

  • Нет связанных вопросов^_^