findFirstFileExA 函数 (fileapi.h)
在目录中搜索具有与指定属性匹配的名称和属性的文件或子目录。
有关此函数的最基本的版本,请参阅 FindFirstFile。
若要以事务处理操作的形式执行此操作,请使用 FindFirstFileTransacted 函数。
语法
HANDLE FindFirstFileExA(
[in] LPCSTR lpFileName,
[in] FINDEX_INFO_LEVELS fInfoLevelId,
[out] LPVOID lpFindFileData,
[in] FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
[in] DWORD dwAdditionalFlags
);
参数
[in] lpFileName
目录或路径,以及文件名。 文件名可以包含通配符,例如星号 (*) 或问号 (?) 。
此参数不应为 NULL、无效字符串 (例如,空字符串或缺少终止 null 字符的字符串) ,或以尾随反斜杠 (\) 结尾。
如果字符串以通配符、句点或目录名称结尾,则用户必须有权访问路径上的根目录和所有子目录。
默认情况下,名称限制为MAX_PATH个字符。 若要将此限制扩展到 32,767 个宽字符,请在路径前面添加“\\?\”。 有关详细信息,请参阅命名文件、路径和命名空间。
提示
从 Windows 10 版本 1607 开始,可以选择删除MAX_PATH限制,而无需在前面添加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。
[in] fInfoLevelId
返回的数据的信息级别。
此参数是 FINDEX_INFO_LEVELS 枚举值之一。
[out] lpFindFileData
指向接收文件数据的缓冲区的指针。
指针类型由 fInfoLevelId 参数中指定的信息级别决定。
[in] fSearchOp
要执行的筛选类型与通配符匹配不同。
此参数是 FINDEX_SEARCH_OPS 枚举值之一。
lpSearchFilter
如果指定的 fSearchOp 需要结构化搜索信息,则为指向搜索条件的指针。
目前,任何受支持的 fSearchOp 值都不需要扩展搜索信息。 因此,此指针必须为 NULL。
[in] dwAdditionalFlags
指定控制搜索的其他标志。
返回值
如果函数成功,则返回值是后续调用 FindNextFile 或 FindClose 中使用的搜索句柄, lpFindFileData 参数包含有关找到的第一个文件或目录的信息。
如果函数失败或未能从 lpFileName 参数中的搜索字符串中找到文件,则返回值 INVALID_HANDLE_VALUE 且 lpFindFileData 的内容不确定。 若要获取扩展的错误信息,请调用 GetLastError 函数。
备注
FindFirstFileEx 函数打开一个搜索句柄,并返回有关文件系统使用与指定模式匹配的名称查找的第一个文件的信息。 当给定相同的文件名字符串模式时,这可以是也可能不是目录列表应用程序中出现的第一个文件或目录, (例如 dir 命令) 。 这是因为 FindFirstFileEx 不对搜索结果进行排序。 有关详细信息,请参阅 FindNextFile。
以下列表标识了一些其他搜索特征:
- 搜索严格根据文件名执行,而不是对日期或文件类型等任何属性执行。
- 搜索包括长文件名和短文件名。
- 尝试使用尾随反斜杠打开搜索始终失败。
- 为 lpFileName 参数传递无效的字符串、NULL 或空字符串不是此函数的有效用法。 在这种情况下,结果未定义。
建立搜索句柄后,在 FindNextFile 函数中使用它来搜索与正在执行的相同筛选的相同模式匹配的其他文件。 当不需要搜索句柄时,应使用 FindClose 函数将其关闭。
如前所述,不能在 FindFirstFileEx 的 lpFileName 输入字符串中使用尾随反斜杠 (\) ,因此搜索根目录的方式可能并不明显。 如果要查看文件或获取根目录的属性,将应用以下选项:
- 若要检查根目录中的文件,可以使用“C:\*”并使用 FindNextFile 单步执行目录。
- 若要获取根目录的属性,请使用 GetFileAttributes 函数。
在网络共享上,可以使用格式如下的 lpFileName :“\\server\service\*”。 但是,不能使用指向共享本身的 lpFileName ;例如,“\\server\service”无效。
若要检查不是根目录的目录,请使用该目录的路径,而不使用尾随反斜杠。 例如,“C:\Windows”的参数返回有关目录“C:\Windows”的信息,而不是有关“C:\Windows”中的目录或文件的信息。 若要检查“C:\Windows”中的文件和目录,请使用“C:\Windows\*”的 lpFileName 。
以下调用:
FindFirstFileEx( lpFileName,
FindExInfoStandard,
lpFindData,
FindExSearchNameMatch,
NULL,
0 );
等效于以下调用:
FindFirstFile( lpFileName, lpFindData );
请注意,在查询结果和处理信息的时间之间,其他线程或进程可能会创建或删除具有此名称的文件。 如果这是应用程序的潜在问题,一种可能的解决方案是将 CreateFile 函数与 CREATE_NEW (如果文件存在 ) ,则 OPEN_EXISTING (如果该文件不存在) ,则 (失败。
如果要编写 32 位应用程序以列出目录中的所有文件,并且该应用程序可能在 64 位计算机上运行,则应在调用 FindFirstFileEx 之前调用 Wow64DisableWow64FsRedirection,并在最后一次调用 FindNextFile 之后调用 Wow64RevertWow64FsRedirection。 有关详细信息,请参阅 文件系统重定向程序。
如果路径指向符号链接, 则WIN32_FIND_DATA 缓冲区包含有关符号链接的信息,而不是目标。
在 Windows 8 和 Windows Server 2012 中,以下技术支持此函数。
技术 | 支持 |
---|---|
(SMB) 3.0 协议的服务器消息块 | 是 |
SMB 3.0 透明故障转移 (TFO) | 是 |
具有横向扩展文件共享的 SMB 3.0 (SO) | 是 |
群集共享卷文件系统 (CsvFS) | 是 |
弹性文件系统 (ReFS) | 是 |
示例
以下代码演示 了 FindFirstFileEx 的最小使用。 此程序等效于 FindFirstFile 主题中的示例。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
void _tmain(int argc, TCHAR *argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
if( argc != 2 )
{
_tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
return;
}
_tprintf (TEXT("Target file is %s\n"), argv[1]);
hFind = FindFirstFileEx(argv[1], FindExInfoStandard, &FindFileData,
FindExSearchNameMatch, NULL, 0);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("FindFirstFileEx failed (%d)\n", GetLastError());
return;
}
else
{
_tprintf (TEXT("The first file found is %s\n"),
FindFileData.cFileName);
FindClose(hFind);
}
}
注意
fileapi.h 标头将 FindFirstFileEx 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定。
要求
最低受支持的客户端 | Windows XP [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | fileapi.h (包括 Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |