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


我正在使用Windows API调用 用FindFirstFile 和 FindNextFile 搜索与目录中某个通配符字符串匹配的文件。例如,我可能想要查找目录中的所有XML文件,因此我使用模式“* .xml”进行搜索。

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

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


2262
2017-11-09 19:09


起源



答案:


查看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
2017-11-09 19:34



有趣。我需要支持Windows XP,所以我可能不能依赖这个功能。不幸的是,在Windows 7中添加到此API的事实可能表明它在此之前不存在于任何其他API中。 - Chris Vasselli
看起来就是这样。很抱歉让你失败了:)感谢编辑,@ Rob - JoeFish
事实证明这个文档非常具有误导性。即使您传入FindExInfoBasic,搜索仍将查找与短名称匹配的文件。它不会在WIN32_FIND_DATA结构的cAlternateFileName成员中包含短文件名。 - Chris Vasselli
但我发现有一个Windows函数PathMatchSpec将对提供的字符串执行相同的通配符匹配。所以,我能够在搜索中添加第二步,验证长名称与模式匹配。谢谢你的帮助@JoeFish! - Chris Vasselli
太棒了,很高兴你搞定了! - JoeFish


答案:


查看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
2017-11-09 19:34



有趣。我需要支持Windows XP,所以我可能不能依赖这个功能。不幸的是,在Windows 7中添加到此API的事实可能表明它在此之前不存在于任何其他API中。 - Chris Vasselli
看起来就是这样。很抱歉让你失败了:)感谢编辑,@ Rob - JoeFish
事实证明这个文档非常具有误导性。即使您传入FindExInfoBasic,搜索仍将查找与短名称匹配的文件。它不会在WIN32_FIND_DATA结构的cAlternateFileName成员中包含短文件名。 - Chris Vasselli
但我发现有一个Windows函数PathMatchSpec将对提供的字符串执行相同的通配符匹配。所以,我能够在搜索中添加第二步,验证长名称与模式匹配。谢谢你的帮助@JoeFish! - Chris Vasselli
太棒了,很高兴你搞定了! - JoeFish


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

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


3
2017-10-03 07:06