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)将其关闭。

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

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

在网络共享上,可以使用格式为“\\Server\Share\*”的 lpFileName 。 但是,不能使用指向共享本身的 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)
群集共享卷文件系统 (CSV)
弹性文件系统 (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 应用]
目标平台 Windows
标头 fileapi.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

文件管理函数

FindClose

FindFirstFileEx

FindFirstFileTransacted

FindNextFile

GetFileAttributes

SetFileAttributes

符号链接

使用 Windows 标头

WIN32_FIND_DATA