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

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

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

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

2 ответа

Решение

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

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

Проверьте 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.

Другие вопросы по тегам