FindFirstFileA 函数 (fileapi.h)

在目录中搜索与特定名称匹配的名称的文件或子目录(如果使用通配符时为部分名称)。

若要指定要在搜索中使用的其他属性,请使用 FindFirstFileEx 函数。

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

语法

HANDLE FindFirstFileA(
  [in]  LPCSTR             lpFileName,
  [out] LPWIN32_FIND_DATAA lpFindFileData
);

参数

[in] lpFileName

目录或路径以及文件名。 文件名可以包含通配符,例如星号 \ 或问号(?)。

此参数不应 NULL、无效字符串(例如,空字符串或缺少终止 null 字符的字符串)或尾随反斜杠 (\) 结尾。

如果字符串以通配符、句点(.)或目录名称结尾,则用户必须具有对路径上根目录和所有子目录的访问权限。

默认情况下,名称限制为MAX_PATH个字符。 若要将此限制扩展到 32,767 宽字符,请将“\\?\”前面追加到路径。 有关详细信息,请参阅 命名文件、路径和命名空间

提示

从 Windows 10 版本 1607 开始,你可以选择加入以删除MAX_PATH限制,而无需追加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。

[out] lpFindFileData

指向 WIN32_FIND_DATA 结构的指针,该结构接收有关找到的文件或目录的信息。

返回值

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

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

如果函数由于找不到匹配文件而失败,GetLastError 函数将返回 ERROR_FILE_NOT_FOUND

言论

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

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

  • 搜索严格地对文件的名称执行,而不是对日期或文件类型等任何属性(有关其他选项,请参阅 FindFirstFileEx)。
  • 搜索包括长文件名和短文件名。
  • 尝试打开带有尾随反斜杠的搜索始终失败。
  • lpFileName 参数传递无效字符串、NULL或空字符串不是此函数的有效用法。 在这种情况下,结果未定义。
注意 在极少数情况下或在大量加载的系统上,在调用此函数时,NTFS 文件系统上的文件属性信息可能不是最新的。 若要确保获取当前的 NTFS 文件系统文件属性,请调用 GetFileInformationByHandle 函数。
 
建立搜索句柄后,可以使用它通过 FindNextFile 函数搜索与相同模式匹配的其他文件。

不再需要搜索句柄时,请使用 FindClose 函数将其关闭,而不是 CloseHandle

如前所述,不能在 lpFileName 输入字符串中使用尾随反斜杠(\),FindFirstFile,因此搜索根目录可能并不明显。 如果想要查看文件或获取根目录的属性,以下选项将适用:

  • 若要检查根目录中的文件,可以使用“C:\*”并通过 FindNextFile单步执行目录。
  • 若要获取根目录的属性,请使用 GetFileAttributes 函数。
注释 追加字符串“\\?\”不允许访问根目录。
 

在网络共享上,可以使用 lpFileName,格式如下:“\\Server\Share\*”。 但是,不能使用指向共享本身的 lpFileName;例如,“\\Server\Share”无效。

若要检查不是根目录的目录,请使用该目录的路径,而无需尾随反斜杠。 例如,“C:\Windows”的参数返回有关目录“C:\Windows”的信息,而不是有关“C:\Windows”中的目录或文件的信息。 若要检查“C:\Windows”中的文件和目录,请使用“C:\Windows\*”lpFileName

请注意,其他一些线程或进程可以在查询结果和处理信息的时间之间创建或删除具有此名称的文件。 如果这是应用程序的潜在问题,一种可能的解决方案是将 CreateFile 函数与 CREATE_NEW(如果文件存在时失败)或 OPEN_EXISTING(如果文件不存在,则失败)。

如果要编写 32 位应用程序以列出目录中的所有文件,并且该应用程序可能在 64 位计算机上运行, 在 调用 FindFirstFile 之前,应先调用 Wow64DisableWow64FsRedirection 函数,并在上次调用 FindNextFile后调用 Wow64RevertWow64FsRedirection。 有关详细信息,请参阅 文件系统重定向程序

如果路径指向符号链接,则 WIN32_FIND_DATA 缓冲区包含有关符号链接的信息,而不是目标。

在 Windows 8 和 Windows Server 2012 中,以下技术支持此函数。

科技 支持
服务器消息块 (SMB) 3.0 协议 是的
SMB 3.0 透明故障转移 (TFO) 是的
具有横向扩展文件共享的 SMB 3.0 (SO) 是的
群集共享卷文件系统 (CsvFS) 是的
可复原文件系统 (ReFS) 是的
 

例子

以下C++示例演示了 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 = FindFirstFile(argv[1], &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}

有关另一个示例,请参阅 列出目录中的文件。

注意

fileapi.h 标头将 FindFirstFile 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows XP [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2003 [桌面应用 |UWP 应用]
目标平台 窗户
标头 fileapi.h (包括 Windows.h)
Kernel32.lib
DLL Kernel32.dll

另请参阅

文件管理功能

FindClose

FindFirstFileEx

FindFirstFileTransacted

FindNextFile

GetFileAttributes

SetFileAttributes

符号链接

使用 Windows 标头

WIN32_FIND_DATA