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