Есть ли альтернатива API-интерфейсу Windows FindFirstFile/FindNextFile, который не ищет короткие имена файлов?

Я использую вызовы Windows API FindFirstFile и FindNextFile для поиска файлов, соответствующих определенному шаблону строка в каталоге. Например, мне может понадобиться найти все файлы XML в каталоге, и поэтому я выполняю поиск с использованием шаблона "*.xml".

Я столкнулся с проблемой, что если я ищу 3-буквенное расширение, а расширение файла начинается с этого 3-буквенного расширения, оно будет подхвачено моим поиском, даже если расширение содержит больше символы после первых 3. Например, если мой файл называется somelongname.xmlaaaa, это будет вызвано поиском "*.xml". Краткое имя этого файла - somelo ~ 1.xml, которое соответствует моей подстановочной строке.

Я мог бы сделать свой собственный подстановочный знак, чтобы обойти эту проблему, но предположительно, что Windows API сможет сделать это более эффективно, чем я мог бы, и мой код будет проще. Насколько я могу судить, нет способа заставить эти функции игнорировать короткие имена. Есть ли какой-либо API-интерфейс Windows с этой функциональностью?

Ответ 1

К сожалению, документация JoeFish, найденная в его ответе, оказывается немного вводить в заблуждение. Поиск по-прежнему найдет файлы, которые соответствуют краткому имени, даже если вы перейдете в FindExInfoBasic. Он просто не включает короткое имя файла в члене cAlternateFileName структуры WIN32_FIND_DATA.

Однако я обнаружил, что существует функция Windows PathMatchSpec, которая будет выполнять тот же шаблон, что и для поставляемой строки. Итак, я смог добавить второй шаг к моему поиску, который проверяет, что длинное имя соответствует шаблону. Он даже доступен в Windows XP.

Ответ 2

Проверьте FindFirstFileEx - он имеет параметр fInfoLevelId, который принимает перечисление FINDEX_INFO_LEVELS:

typedef enum _FINDEX_INFO_LEVELS {
  FindExInfoStandard,
  FindExInfoBasic,
  FindExInfoMaxInfoLevel 
} FINDEX_INFO_LEVELS;

FindExInfoBasic

Функция FindFirstFileEx не запрашивает короткое имя файла, улучшая общую скорость перечисления. Данные возвращаются в структуре WIN32_FIND_DATA, а член cAlternateFileName всегда является строкой NULL.

Однако:

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: это значение не поддерживается до Windows Server 2008 R2 и Windows 7.