Função FindFirstFileA (fileapi.h)

Em um diretório, pesquisa um arquivo ou subdiretório com um nome que corresponda a um nome específico (ou nome parcial se curingas forem usados).

Para especificar atributos adicionais a serem usados em uma pesquisa, use a função FindFirstFileEx .

Para executar essa operação como uma operação transacionada, use a função FindFirstFileTransacted .

Sintaxe

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

Parâmetros

[in] lpFileName

O diretório ou caminho e o nome do arquivo. O nome do arquivo pode incluir caracteres curinga, por exemplo, um asterisco (*) ou um ponto de interrogação (?).

Esse parâmetro não deve ser NULL, uma cadeia de caracteres inválida (por exemplo, uma cadeia de caracteres vazia ou uma cadeia de caracteres que não tem o caractere nulo de terminação) ou terminar em uma barra invertida à direita (\).

Se a cadeia de caracteres terminar com um curinga, ponto (.) ou nome do diretório, o usuário deverá ter permissões de acesso para a raiz e todos os subdiretórios no caminho.

Por padrão, o nome é limitado a caracteres MAX_PATH. Para estender esse limite para 32.767 caracteres largos, preencha "\\?\" para o caminho. Para obter mais informações, confira Nomear arquivos, caminhos e namespaces.

Dica

A partir do Windows 10, versão 1607, você pode optar por remover a limitação de MAX_PATH sem acrescentar "\\?\". Consulte a seção "Limitação máxima de comprimento do caminho" de Arquivos de Nomenclatura, Caminhos e Namespaces para obter detalhes.

[out] lpFindFileData

Um ponteiro para a estrutura WIN32_FIND_DATA que recebe informações sobre um arquivo ou diretório encontrado.

Retornar valor

Se a função for bem-sucedida, o valor retornado será um identificador de pesquisa usado em uma chamada subsequente para FindNextFile ou FindClose, e o parâmetro lpFindFileData conterá informações sobre o primeiro arquivo ou diretório encontrado.

Se a função falhar ou falhar ao localizar arquivos da cadeia de caracteres de pesquisa no parâmetro lpFileName , o valor retornado será INVALID_HANDLE_VALUE e o conteúdo de lpFindFileData será indeterminado. Para obter informações de erro estendidas, chame a função GetLastError.

Se a função falhar porque nenhum arquivo correspondente pode ser encontrado, a função GetLastError retornará ERROR_FILE_NOT_FOUND.

Comentários

A função FindFirstFile abre um identificador de pesquisa e retorna informações sobre o primeiro arquivo que o sistema de arquivos encontra com um nome que corresponde ao padrão especificado. Esse pode ou não ser o primeiro arquivo ou diretório que aparece em um aplicativo de listagem de diretórios (como o comando dir) quando fornecido o mesmo padrão de cadeia de caracteres de nome de arquivo. Isso ocorre porque FindFirstFile não classifica os resultados da pesquisa. Para obter mais informações, consulte FindNextFile.

A lista a seguir identifica algumas outras características de pesquisa:

  • A pesquisa é executada estritamente no nome do arquivo, não em nenhum atributo, como uma data ou um tipo de arquivo (para outras opções, consulte FindFirstFileEx).
  • A pesquisa inclui os nomes de arquivo longos e curtos.
  • Uma tentativa de abrir uma pesquisa com uma barra invertida à direita sempre falha.
  • Passar uma cadeia de caracteres inválida, NULL ou uma cadeia de caracteres vazia para o parâmetro lpFileName não é um uso válido dessa função. Os resultados nesse caso são indefinidos.
Nota Em casos raros ou em um sistema fortemente carregado, as informações de atributo de arquivo em sistemas de arquivos NTFS podem não estar atuais no momento em que essa função é chamada. Para ter certeza de obter os atributos de arquivo do sistema de arquivos NTFS atuais, chame a função GetFileInformationByHandle .
 
Depois que o identificador de pesquisa for estabelecido, você poderá usá-lo para pesquisar outros arquivos que correspondam ao mesmo padrão usando a função FindNextFile .

Quando o identificador de pesquisa não for mais necessário, feche-o usando a função FindClose , não CloseHandle.

Conforme indicado anteriormente, você não pode usar uma barra invertida à direita (\) na cadeia de caracteres de entrada lpFileName para FindFirstFile, portanto, pode não ser óbvio como pesquisar diretórios raiz. Se você quiser ver arquivos ou obter os atributos de um diretório raiz, as seguintes opções se aplicarão:

  • Para examinar arquivos em um diretório raiz, você pode usar "C:\*" e percorrer o diretório usando FindNextFile.
  • Para obter os atributos de um diretório raiz, use a função GetFileAttributes .
Nota A anexação da cadeia de caracteres "\\?\" não permite o acesso ao diretório raiz.
 

Em compartilhamentos de rede, você pode usar um lpFileName na forma do seguinte: "\\Server\Share\*". No entanto, você não pode usar um lpFileName que aponta para o compartilhamento em si; por exemplo, "\\Server\Share" não é válido.

Para examinar um diretório que não é um diretório raiz, use o caminho para esse diretório, sem uma barra invertida à direita. Por exemplo, um argumento de "C:\Windows" retorna informações sobre o diretório "C:\Windows", não sobre um diretório ou arquivo em "C:\Windows". Para examinar os arquivos e diretórios em "C:\Windows", use um lpFileName de "C:\Windows\*".

Lembre-se de que algum outro thread ou processo pode criar ou excluir um arquivo com esse nome entre o tempo que você consulta o resultado e a hora em que você agir sobre as informações. Se essa for uma preocupação potencial para seu aplicativo, uma solução possível é usar a função CreateFile com CREATE_NEW (que falha se o arquivo existir) ou OPEN_EXISTING (que falha se o arquivo não existir).

Se você estiver escrevendo um aplicativo de 32 bits para listar todos os arquivos em um diretório e o aplicativo puder ser executado em um computador de 64 bits, você deverá chamar a função Wow64DisableWow64FsRedirection antes de chamar FindFirstFile e chamar Wow64RevertWow64FsRedirection após a última chamada para FindNextFile. Para obter mais informações, consulte Redirecionamento do Sistema de Arquivos.

Se o caminho apontar para um link simbólico, o buffer WIN32_FIND_DATA conterá informações sobre o link simbólico, não sobre o destino.

No Windows 8 e Windows Server 2012, essa função é compatível com as tecnologias a seguir.

Tecnologia Com suporte
Protocolo SMB (SMB) 3.0 Sim
TFO (Failover transparente) do SMB 3.0 Sim
SMB 3.0 com compartilhamentos de arquivos de expansão (SO) Sim
Sistema de arquivos de Volume Compartilhado Clusterizado (CsvFS) Sim
ReFS (Sistema de Arquivos Resiliente) Sim
 

Exemplos

O exemplo C++ a seguir mostra um uso mínimo de 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);
   }
}

Para outro exemplo, consulte Listando os arquivos em um diretório.

Observação

O cabeçalho fileapi.h define FindFirstFile como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante de pré-processador UNICODE. Misturar o uso do alias neutro de codificação com código que não seja neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Convenções para protótipos de função.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows XP [aplicativos da área de trabalho | aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho fileapi.h (inclua Windows.h)
Biblioteca Kernel32.lib
DLL Kernel32.dll

Confira também

Funções de gerenciamento de arquivos

FindClose

FindFirstFileEx

FindFirstFileTransacted

FindNextFile

GetFileAttributes

SetFileAttributes

Links simbólicos

Como usar os cabeçalhos do Windows

WIN32_FIND_DATA