MSDN说:
HANDLE WINAPI FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData );
lpFileName
目录或路径以及文件名,可以包含通配符,例如星号(*)或问号(?)......
直到今天,我还没有注意到“例如”。
假设您有一个“c:\ temp”目录,下面的代码显示“temp”。注意搜索到的目录:“c:\ temp>”。如果你有一个“c:\ temp1”目录和一个“c:\ tem”目录,FindNextFile会找到“temp1”,但是找不到“tem”。我认为'<'会找到“tem”,但我错了:它的行为方式相同。你追加多少'<'/'>'并不重要:行为是一样的。
从我的角度来看,这是一个错误('>'&'<'不是文件名中的有效字符)。从微软的角度来看,它可能是一个功能。
我无法找到F * F行为的完整描述。
const TCHAR* s = _T("c:\\temp>");
{
WIN32_FIND_DATA d;
HANDLE h;
h = FindFirstFile( s, &d );
if ( h == INVALID_HANDLE_VALUE )
{
CString m;
m.Format( _T("FindFirstFile failed (%d)\n"), GetLastError() );
AfxMessageBox( m );
return;
}
else
{
AfxMessageBox( d.cFileName );
FindClose( h );
}
}
修改1:
首先,我尝试使用_stat
的Windows实现。它与非法字符'*'和'?'一起工作正常,但忽略'>',所以我介入并注意到实现特别注意了记录的通配符。我以FFF结束了。
编辑2:
我填写了两个错误表单:一个用于FFF,另一个用于_stat。我现在正在等待MS的回答。
我认为窥视一些本应该是黑盒子和推测的东西是不正常的。因此,我的反对意见是基于“合同”所说的:“lpFileName [in]目录或路径,以及文件名,可以包含通配符,例如,星号(*)或问号(?) 。 ......“我不是母语为英语的人。也许它意味着“这些不是唯一的通配符”,也许不是。但是,如果这些不是唯一的通配符,它们应该列出所有(可能是它们)。在这一点上,我认为MS的分辨率将是“按设计”或“无法修复”。
关于_stat,我认为它是一个ISO函数,MSDN说:“返回值:如果获得文件状态信息,这些函数中的每一个都返回0。”它没有说明通配符,记录或不。我没看到_stat可以从“c:\ temp *”或“c:\ temp>>”中检索哪种信息。某人依赖当前行为的可能性极小,因此他们可能会发布修复程序。
编辑3:
Microsoft已将_stat错误关闭为已修复。
“...我们已经为Visual Studio的下一个主要版本修复了这个问题(这将是Visual Studio”14,“但请注意,上周发布的Visual Studio”14“CTP中没有修复此问题。在Visual Studio“14”中,_stat函数现在使用CreateFile来查询路径的存在和属性。使用CreateFile的更改是为了解决与旧的基于FindFirstFile的实现中存在的文件权限相关的其他怪癖。 ,但这一变化也解决了这个问题。......“
答案 0 :(得分:17)
根据2002年的post on the OSR ntfsd
list,这是NtQueryDirectoryFile
/ ZwQueryDirectoryFile
通过FsRtlIsNameInExpression
的故意特征。 <
和>
对应*
和?
,但执行匹配“使用MS-DOS语义”。
The following wildcard characters can be used in the pattern string.
Wildcard character Meaning
* (asterisk) Matches zero or more characters.
? (question mark) Matches a single character.
DOS_DOT Matches either a period or zero characters beyond the name
string.
DOS_QM Matches any single character or, upon encountering a period
or end of name string, advances the expression to the end of
the set of contiguous DOS_QMs.
DOS_STAR Matches zero or more characters until encountering and
matching the final . in the name.
出于某种原因,此页面未提供DOS_*
宏的值,但ntifs.h
确实如此:
// The following constants provide addition meta characters to fully
// support the more obscure aspects of DOS wild card processing.
#define DOS_STAR (L'<')
#define DOS_QM (L'>')
#define DOS_DOT (L'"')