有没有搜索短文件名的Windows FindFirstFile/FindNextFile API的替代品?

I'm using the Windows API calls FindFirstFile and FindNextFile to search for files matching a certain wildcard string in a directory. For example, I might want to find all xml files in a directory, and so I search using the pattern "*.xml".

我遇到的问题是,如果我正在搜索一个3个字母的扩展名,并且文件的扩展名以该3个字母的扩展名开头,那么即使扩展程序包含更多字符,我的搜索也会收到它。第一个3.例如,如果我的文件名为somelongname.xmlaaaa,搜索“* .xml”将会获取该文件。该文件的短名称是somelo~1.xml,它匹配我的通配符字符串。

我可以做自己的通配符匹配来解决这个问题,但可能是一个Windows API能够比我更有效地做到这一点,我的代码会更简单。据我所知,没有办法强制这些函数忽略短名称。是否有任何API Windows公开此功能?

11
额外 编辑
意见: 3

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之前不支持此值。

11
额外
@ChrisVasselli为什么不发布这个作为答案?我认为这将有助于未来的访问者遇到同样的问题..
额外 作者 Louis Rhys,
有趣。我需要支持Windows XP,所以我可能不能依赖这个功能。不幸的是,在Windows 7中添加到此API的事实可能表明它在此之前不存在于任何其他API中。
额外 作者 Chris Vasselli,
事实证明这个文档非常具有误导性。即使您传入FindExInfoBasic,搜索仍将查找与短名称匹配的文件。它不会在WIN32_FIND_DATA结构的cAlternateFileName成员中包含短文件名。
额外 作者 Chris Vasselli,
但我发现有一个Windows函数PathMatchSpec将对提供的字符串执行相同的通配符匹配。所以,我能够在搜索中添加第二步,验证长名称与模式匹配。谢谢你的帮助@JoeFish!
额外 作者 Chris Vasselli,
看起来就是这样。很抱歉让你失败了:)感谢编辑,@ Rob
额外 作者 JoeFish,
太棒了,很高兴你搞定了!
额外 作者 JoeFish,
我今天几乎意外地发现了这一点,只是尝试了不同的选择。在我和同事的机器上,这给了我们几乎精确的x2加速。虽然这实际上降低了我们的性能10%(数据在缓存中) - FIND_FIRST_EX_LARGE_FETCH
额外 作者 malkia,

不幸的是,JoeFish在他的回答中发现的文档证明有点误导。即使您传入FindExInfoBasic,搜索仍将查找与短名称匹配的文件。它不会在WIN32_FIND_DATA结构的cAlternateFileName成员中包含短文件名。

但我发现有一个Windows函数 PathMatchSpec 将对提供的字符串执行相同的通配符匹配。所以,我能够在搜索中添加第二步,验证长名称与模式匹配。它甚至可以在Windows XP中使用。

3
额外