FindFirstFile未记录通配符或错误
FindFirstFile undocumented wildcard or bug?
MSDN显示:
HANDLE WINAPI FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData );
lpFileName
目录或路径和文件名,可以包含通配符,例如星号(*)或问号(?)…
直到今天我才注意到"for example"。
假设你有一个" 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:
我已经填写了两个bug表单:一个用于FFF,另一个用于_stat。我现在正在等待MS的答复。
我认为偷看一个应该是黑匣子的东西并猜测是不正常的。因此,我的反对意见是基于"合同"所说的:"lpFileName [in]目录或路径,以及文件名,其中可以包含通配符,例如星号(*)或问号(?)。"我的母语不是英语。也许它的意思是"这些不是唯一的通配符",也许不是。然而,如果这些不是唯一的通配符,它们应该列出所有的通配符(也许它们会)。在这一点上,我认为微软的解决方案将是"设计"或"不会修复"。
关于_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的实现中存在的文件权限相关的其他问题,但更改也解决了此问题. ..."
根据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'"')
- 表示"accepting anything for this template argument" C++概念的通配符
- 当使用通配符和null指针调用函数时,对输出的说明
- C++17 文件系统::remove_all 带有通配符路径
- 如何允许通配符模板参数
- 使用通配符的跨平台文件列表
- 如何检索由带通配符的字符串索引的对象
- 有效地查找通配符条目
- 具有不同输入和输出名称的生成文件通配符
- MinGW GCC通配符编译所有文件(Windows)
- Windows 上带有通配符的目录中的文件
- 查找第一个文件W通配符匹配
- 在某些情况下,通配符模式匹配失败
- 实现通配符后没有输入文件错误
- 如何为文件对话框过滤器设置通配符
- 使用通配符搜索QTableWidget时出现问题
- 为什么 std::experimental::filesystem::p ath 不接受像 "*" 这样的通配符?
- 在三元搜索树中搜索(NOT with)通配符
- SQLite如何在列上使用LIKE并添加通配符
- FindFirstFile未记录通配符或错误
- 通配符模式匹配中的分割错误