Chr*_*lli 11 c c++ windows filesystems winapi
我正在使用Windows API调用FindFirstFile和FindNextFile来搜索与目录中某个通配符字符串匹配的文件.例如,我可能想要查找目录中的所有XML文件,因此我使用模式"*.xml"进行搜索.
我遇到的问题是,如果我正在搜索一个3个字母的扩展名,并且文件的扩展名以3个字母的扩展名开头,那么即使扩展名包含更多字符,我的搜索也会收到它.第一个3.例如,如果我的文件名为somelongname.xmlaaaa,搜索"*.xml"将会获取该文件.该文件的简称是somelo~1.xml,它匹配我的通配符字符串.
我可以做自己的通配符匹配来解决这个问题,但可能是Windows API能够比我更有效地做到这一点,我的代码会更简单.据我所知,没有办法强制这些函数忽略短名称.是否有任何API Windows公开此功能?
Joe*_*ish 11
查看FindFirstFileEx - 它有一个fInfoLevelId参数,它接受FINDEX_INFO_LEVELS枚举:
typedef enum _FINDEX_INFO_LEVELS {
FindExInfoStandard,
FindExInfoBasic,
FindExInfoMaxInfoLevel
} FINDEX_INFO_LEVELS;
Run Code Online (Sandbox Code Playgroud)
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 中使用。