Позвольте мне сделать несколько заметок о "*.*"
и "*"
. Эти фильтраторы не равны.
В нашей папке могут находиться 2 разных файла: somefile
и somefile.
.
Если бы мы использовали API низкого уровня ZwQueryDirectoryFile
с "*.*"
в качестве поискового выражения (это 10-й параметр - FileName [in, optional]
) - мы получим только somefile.
. Но если бы мы использовали "*"
, то получили бы оба файла - somefile
и somefile.
.
Если мы попробуем FindFirstFile("C:\\semester2\\*.*", &data);
, мы можем заметить, что возвращаются оба файла somefile
и somefile.
. Итак, здесь "*.*"
vs "*"
имеют тот же эффект - никакой разницы в использовании.
Почему так происходит? Потому что внутри FindFirstFileEx
в kernelbase
(kernel32
) сделайте специальную проверку на "*.*"
маску, и если это правда - замените на ""
(пустое имя, которое имеет тот же эффект, что и "*"
).
Я думаю, что это сделано для исправления очень распространенной ошибки, когда пользователи передают "*.*"
вместо правильного "*"
, и для обратной совместимости с устаревшим кодом.
.
и ..
фактически не являются частью каталога, поскольку они хранятся на диске, но добавляются Win32 API.
Это неправда.
- для файловой системы в стиле
FAT
это действительно хранится в каталоге FAT как 2 первые записи.
- в
NTFS
таких записей нет, но NTFS.sys
искусственно добавляют эти 2 записи, если они в маске.
Так что это делается не на уровне Win32 API, а в ядре - на уровне драйвера.
В заключение, "*.*"
будет правильно работать с Win32 API, как минимум сейчас, но правильный и чистый способ - использовать здесь "*"
.
"*.*"
будет ошибкой с _ 33_ api.
person
RbMm
schedule
31.12.2016
W
кWIN32_FIND_DATA
,FindFirstFile
, &FindNextFile
,L
префикс к литералу пути, заменитьstd::cout
наstd::wcout
) или использовать последовательноTCHAR
s (добавить#include <tchar.h>
, сделать строковый литерал_T("C:\\semester2")
, и условно псевдоним отstd::tcout
до _12 _ / _ 13_ в зависимости от ситуации). - person ShadowRanger   schedule 12.06.2019