FindFirstFileExW 函数 (fileapi.h)

使用与指定的名称和属性匹配的文件或子目录搜索目录。

有关此函数的最基本版本,请参阅 FindFirstFile

若要将此操作作为事务处理操作执行,请使用 FindFirstFileTransacted 函数。

语法

HANDLE FindFirstFileExW(
  [in]  LPCWSTR            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,000 个宽字符,请调用函数的 Unicode 版本(FindFirstFileExW),并将“\\?”前面追加到路径。 有关详细信息,请参阅 命名文件

提示 从 Windows 10 版本 1607 开始,对于此函数的 unicode 版本(FindFirstFileExW),可以选择加入以删除 MAX_PATH 字符限制,而无需追加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径限制”部分。
 

[in] fInfoLevelId

返回的数据的信息级别。

此参数是 FINDEX_INFO_LEVELS 枚举值之一。

[out] lpFindFileData

指向接收文件数据的缓冲区的指针。

指针类型由 fInfoLevelId 参数中指定的信息级别确定。

[in] fSearchOp

要执行的筛选类型与通配符匹配不同。

此参数是 FINDEX_SEARCH_OPS 枚举值之一。

lpSearchFilter

如果指定的 fSearchOp 需要结构化搜索信息,则指向搜索条件的指针。

目前,不支持的 fSearchOp 值都不需要扩展搜索信息。 因此,此指针必须 NULL

[in] dwAdditionalFlags

指定控制搜索的其他标志。

价值 意义
FIND_FIRST_EX_CASE_SENSITIVE
1
搜索区分大小写。
FIND_FIRST_EX_LARGE_FETCH
2
对目录查询使用更大的缓冲区,从而提高查找操作的性能。

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:在 Windows Server 2008 R2 和 Windows 7 之前不支持此值。

FIND_FIRST_EX_ON_DISK_ENTRIES_ONLY
4
将结果限制为磁盘上物理上的文件。 仅当存在文件虚拟化筛选器时,此标志才相关。

返回值

如果函数成功,则返回值是后续调用 FindNextFileFindClose的搜索句柄,lpFindFileData 参数包含有关找到的第一个文件或目录的信息。

如果函数失败或未能从 lpFileName 参数中的搜索字符串中查找文件,则返回值 INVALID_HANDLE_VALUElpFindFileData 的内容不确定。 若要获取扩展的错误信息,请调用 GetLastError 函数。

言论

FindFirstFileEx 函数将打开一个搜索句柄,并返回有关文件系统查找的第一个文件的信息,该文件的名称与指定的模式匹配。 当给定相同的文件名字符串模式时,这可能不是出现在目录列表应用程序(如 dir 命令)中的第一个文件或目录。 这是因为 FindFirstFileEx 不对搜索结果进行排序。 有关详细信息,请参阅 FindNextFile

以下列表标识了其他一些搜索特征:

  • 搜索严格地对文件的名称执行,而不是对日期或文件类型等任何属性执行。
  • 搜索包括长文件名和短文件名。
  • 尝试打开带有尾随反斜杠的搜索始终失败。
  • lpFileName 参数传递无效字符串、NULL或空字符串不是此函数的有效用法。 在这种情况下,结果未定义。
注意 在极少数情况下或在大量加载的系统上,在调用此函数时,NTFS 文件系统上的文件属性信息可能不是最新的。 若要确保获取当前的 NTFS 文件系统文件属性,请调用 GetFileInformationByHandle 函数。
 
如果基础文件系统不支持指定的筛选类型(除了目录筛选)之外,FindFirstFileEx 失败,并出现错误 ERROR_NOT_SUPPORTED。 应用程序必须使用 FINDEX_SEARCH_OPS 类型 FileExSearchNameMatch 并执行其自己的筛选。

建立搜索句柄后,在 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 位计算机上运行, 在 调用 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 应用]
目标平台 窗户
标头 fileapi.h (包括 Windows.h)
Kernel32.lib
DLL Kernel32.dll

另请参阅

FINDEX_INFO_LEVELS

FINDEX_SEARCH_OPS

文件管理功能

FindClose

FindFirstFile

FindFirstFileTransacted

FindNextFile

GetFileAttributes

命名文件

符号链接

使用 Windows 标头

WIN32_FIND_DATA