Is there an alternative to the Windows FindFirstFile/FindNextFile API that doesn't search short file names?
我正在使用Windows API调用FindFirstFile和FindNextFile来搜索与目录中某个通配符字符串匹配的文件。例如,我可能想在目录中找到所有XML文件,因此我使用模式" * .xml"进行搜索。
我遇到了一个问题,如果我正在搜索一个三字母扩展名,并且文件的扩展名以该三字母扩展名开头,即使我的搜索扩展名中包含更多字符,该文件也会被我的搜索选择前3个。例如,如果我的文件名为somelongname.xmlaaaa,则搜索" * .xml"会发现该文件。该文件的简称为somelo?1.xml,与我的通配符字符串匹配。
我可以做自己的通配符匹配来解决此问题,但是大概Windows API可以比我更有效地做到这一点,并且我的代码将更简单。据我所知,没有办法强制这些函数忽略短名称。 Windows有此功能公开的API吗?
签出FindFirstFileEx-它具有一个fInfoLevelId参数,该参数采用FINDEX_INFO_LEVELS枚举:
1 2 3 4 5 | typedef enum _FINDEX_INFO_LEVELS { FindExInfoStandard, FindExInfoBasic, FindExInfoMaxInfoLevel } FINDEX_INFO_LEVELS; |
FindExInfoBasic
The FindFirstFileEx function does not query the short file name, improving overall enumeration speed. The data is returned in a WIN32_FIND_DATA structure, and the cAlternateFileName member is always a NULL string.
然而:
Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP: This value is not supported until Windows Server 2008 R2 and Windows 7.
不幸的是,JoeFish在他的答案中发现的文档有些误导。 即使您传入FindExInfoBasic,搜索仍然会找到与短名称匹配的文件。 它只是不会在WIN32_FIND_DATA结构的cAlternateFileName成员中包含短文件名。
但是,我确实发现有一个Windows函数PathMatchSpec,它将对提供的字符串执行相同的通配符匹配。 因此,我能够在搜索中添加第二步,以验证长名称是否与模式匹配。 Windows XP中甚至提供了该功能。