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的实现中存在的文件权限有关的其他怪癖,改变也解决了这个问题……“
根据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开发人员编写的)的博客中,我一直在寻找这方面的任何证据,但是一直没能找到一丝一毫。