Есть ли альтернатива 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.