Есть ли альтернатива Windows FindFirstFile / FindNextFile API, которая не ищет короткие имена файлов? - PullRequest
11 голосов
/ 09 ноября 2011

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

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

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

Ответы [ 2 ]

11 голосов
/ 09 ноября 2011

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

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

FindExInfoBasic

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

Тем не менее:

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

3 голосов
/ 03 октября 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...