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 函数将其关闭。
如前所述,不能在 lpFileName 输入字符串中使用尾随反斜杠(\),FindFirstFileEx,因此搜索根目录可能并不明显。 如果想要查看文件或获取根目录的属性,以下选项将适用:
- 若要检查根目录中的文件,可以使用“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 位计算机上运行, 在
如果路径指向符号链接,则 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 应用] |
目标平台 | 窗户 |
标头 | fileapi.h (包括 Windows.h) |
库 | Kernel32.lib |
DLL | Kernel32.dll |
另请参阅
使用 Windows 标头