FindFirstFile未公开的通配符或错误?

MSDN说:

HANDLE WINAPI FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ); 

lpFileName目录或path以及文件名,可以包含通配符,例如星号(*)或问号(?)…

直到今天,我没有注意到“例如”。

假设你有一个“c:\ temp”目录,下面的代码显示“temp”。 注意search到的目录:“c:\ temp>”。 如果您有一个“c:\ temp1”目录和一个“c:\ tem”目录,FindNextFile将find“temp1”但不会find“tem”。 我认为'<'会find“tem”,但我错了:它的行为方式是一样的。 无论你追加多less个'''''''',行为都是一样的。

从我的angular度来看,这是一个错误('>'&'<'在文件名中不是有效的字符)。 从微软的angular度来看,这可能是一个特点。

我没有findF * 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实现。 它用非法字符'*'和'?'工作正常,但忽略了'>',所以我介入并注意到执行特别注意了logging的通配符。 我在FFF结束。

编辑2:

我填充了两个错误表单:一个用于FFF,另一个用于_stat。 我现在正在等待MS的回答。

我认为,窥探那些被认为是黑盒子和推测的东西是不正常的。 因此,我的反对意见是基于“契约”所说的:“lpFileName [in]目录或path,文件名可以包含通配符,例如星号(*)或问号(?) 。 …“我不是以英语为母语的人。 也许这意味着“这不是唯一的通配符”,也许不是。 但是,如果这些不是唯一的通配符,他们应该列出所有(也许他们会)。 在这一点上,我认为MS的决议将是“按devise”或“不会修复”。

关于_stat,我认为它是一个ISO函数,MSDN说:“返回值:如果获得文件状态信息,每个函数都会返回0”。它没有提到有关通配符的事情。 我看不到_stat可能从“c:\ temp *”或“c:\ temp >>”中检索到什么样的信息。 有人依靠现有的行为是不太可能的,所以他们可能会发出修复。

编辑3:

微软已经将固定的_stat错误closures了。

“…我们已经修复了Visual Studio的下一个主要版本(这将是Visual Studio”14“,但请注意,该修补程序在上周发布的Visual Studio”14“CTP中不存在)。在Visual Studio“14”中,_stat函数现在使用CreateFile来查询path的存在和属性,使用CreateFile的改变是为了解决与旧的基于FindFirstFile的实现中存在的文件权限有关的其他怪癖,改变也解决了这个问题……“

Solutions Collecting From Web of "FindFirstFile未公开的通配符或错误?"

根据2002年OSR ntfsd列表中的一篇文章 ,这是NtQueryDirectoryFile / ZwQueryDirectoryFile通过FsRtlIsNameInExpression一个有意的特性。 <>对应于*? ,但执行匹配的“使用MS-DOS语义”。

FsRtlIsNameInExpression指出:

 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'"') 

这似乎是一个无证的功能。 在MSDN或博客追溯到2000年(一些由Windows开发人员编写的)的博客中,我一直在寻找这方面的任何证据,但是一直没能找到一丝一毫。