我正在使用Windows API调用 用FindFirstFile 和 FindNextFile 搜索与目录中某个通配符字符串匹配的文件。例如,我可能想要查找目录中的所有XML文件,因此我使用模式“* .xml”进行搜索。
我遇到的问题是,如果我正在搜索一个3个字母的扩展名,并且文件的扩展名以该3个字母的扩展名开头,那么即使扩展程序包含更多字符,我的搜索也会收到它。第一个3.例如,如果我的文件名为somelongname.xmlaaaa,搜索“* .xml”将会获取该文件。该文件的短名称是somelo~1.xml,它匹配我的通配符字符串。
我可以做自己的通配符匹配来解决这个问题,但可能是一个Windows API能够比我更有效地做到这一点,我的代码会更简单。据我所知,没有办法强制这些函数忽略短名称。是否有任何API Windows公开此功能?
查看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之前不支持此值。
查看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之前不支持此值。
不幸的是,JoeFish在他的回答中发现的文档证明有点误导。即使您传入FindExInfoBasic,搜索仍将查找与短名称匹配的文件。它不会在WIN32_FIND_DATA结构的cAlternateFileName成员中包含短文件名。
但我发现有一个Windows功能 PathMatchSpec 这将对提供的字符串执行相同的通配符匹配。所以,我能够在搜索中添加第二步,验证长名称与模式匹配。它甚至可以在Windows XP中使用。