#winapi #file #file-io #wildcard
#winapi #файл #file-io #подстановочный знак
Вопрос:
Почему вызов FindFirstFile
с шаблоном *.*
соответствует имени, подобному Windows
?
Редактировать: Думаю, я тоже могу догадаться, что происходит, но есть ли какая-либо документация о причине?
Комментарии:
1. возможно, это не что иное, как
*
сопоставление пустой строки. Попробуйте*.?*
сказать, чтобы соответствовать непустому расширению2. @David: Но что, если имя файла заканчивается точкой?
3. Вы упоминаете, что
*
может совпадать с пустой строкой, но это работает, только если имя файла заканчивается точкой.Windows
не заканчивается точкой, так почему она должна совпадать?4. в его коротком имени стоит точка. Все короткие имена соответствуют.
5. может быть, вам следует прочитать исходный код для Wine и, по крайней мере, вы бы изучили алгоритм, если не обоснование, лежащее в его основе
Ответ №1:
В сообщении в блоге «Как работали подстановочные знаки в MS-DOS?» Рэймонд Чен описывает, как было реализовано оригинальное сопоставление подстановочных знаков DOS. В конце сообщения он указывает, как *.*
обрабатывается как особый случай в алгоритме сопоставления подстановочных знаков Win32.
Цитата из сообщения
For example, if your pattern ends in .*, the .* is ignored. Without this rule, the pattern *.* would match only files that contained a dot, which would break probably 90% of all the batch files on the planet, as well as everybody's muscle memory, since everybody running Windows NT 3.1 grew up in a world where *.* meant all files.
Ответ №2:
*.*
соответствует всему в целевом каталоге.
Это связано с тем, что *.
совпадает с конечной точкой; если в имени нет точки, то это имя обрабатывается так, как если бы оно заканчивалось точкой; таким образом, *.
совпадают только имена, начинающиеся с точки, и имена, не содержащие точки ( .afile / adirname
) если вы добавляете *
в конце для *.*
, то оно также совпадает после конечной точки, поэтому включает имена файлов, содержащие точку, это охватывает все возможные имена файлов.