Partager via


Fonction FindFirstFileExW (fileapi.h)

Recherche un répertoire pour un fichier ou un sous-répertoire avec un nom et des attributs qui correspondent à ceux spécifiés.

Pour obtenir la version la plus simple de cette fonction, consultez FindFirstFile.

Pour effectuer cette opération en tant qu’opération transactionnelle, utilisez la fonction FindFirstFileTransacted.

Syntaxe

HANDLE FindFirstFileExW(
  [in]  LPCWSTR            lpFileName,
  [in]  FINDEX_INFO_LEVELS fInfoLevelId,
  [out] LPVOID             lpFindFileData,
  [in]  FINDEX_SEARCH_OPS  fSearchOp,
        LPVOID             lpSearchFilter,
  [in]  DWORD              dwAdditionalFlags
);

Paramètres

[in] lpFileName

Répertoire ou chemin d’accès et nom de fichier. Le nom de fichier peut inclure des caractères génériques, par exemple un astérisque (*) ou un point d’interrogation ( ?).

Ce paramètre ne doit pas être null, une chaîne non valide (par exemple, une chaîne vide ou une chaîne qui manque le caractère null de fin), ou se terminer dans une barre oblique inverse de fin (\).

Si la chaîne se termine par un caractère générique, un point ou un nom de répertoire, l’utilisateur doit avoir accès à la racine et à tous les sous-répertoires sur le chemin d’accès.

Dans cette fonction, le nom est limité à MAX_PATH caractères. Pour étendre cette limite à environ 32 000 caractères larges, appelez la version Unicode de la fonction (FindFirstFileExW) et ajoutez « \\ ?\ » au chemin d’accès. Pour plus d’informations, consultez nommage d’un fichier.

conseil à partir de Windows 10, version 1607, pour la version unicode de cette fonction (FindFirstFileExW), vous pouvez choisir de supprimer la limitation des caractères MAX_PATH sans précéder « \\ ?\ ». Pour plus d’informations, consultez la section « Limitation maximale du chemin d’accès » de fichiers, chemin s d’accès et espaces de noms.
 

[in] fInfoLevelId

Niveau d’informations des données retournées.

Ce paramètre est l’une des valeurs d’énumération FINDEX_INFO_LEVELS.

[out] lpFindFileData

Pointeur vers la mémoire tampon qui reçoit les données du fichier.

Le type de pointeur est déterminé par le niveau d’informations spécifié dans le paramètre fInfoLevelId.

[in] fSearchOp

Type de filtrage à effectuer qui diffère de la mise en correspondance de caractères génériques.

Ce paramètre est l’une des valeurs d’énumération FINDEX_SEARCH_OPS.

lpSearchFilter

Pointeur vers les critères de recherche si le fSearchOp spécifié a besoin d’informations de recherche structurées.

À ce stade, aucune des valeurs fSearchOp prises en charge ne nécessite d’informations de recherche étendues. Par conséquent, ce pointeur doit être NULL.

[in] dwAdditionalFlags

Spécifie des indicateurs supplémentaires qui contrôlent la recherche.

Valeur Signification
FIND_FIRST_EX_CASE_SENSITIVE
1
Les recherches respectent la casse.
FIND_FIRST_EX_LARGE_FETCH
2
Utilise une mémoire tampon plus grande pour les requêtes d’annuaire, ce qui peut augmenter les performances de l’opération de recherche.

Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : Cette valeur n’est pas prise en charge tant que Windows Server 2008 R2 et Windows 7 ne sont pas pris en charge.

FIND_FIRST_EX_ON_DISK_ENTRIES_ONLY
4
Limite les résultats aux fichiers physiquement sur le disque. Cet indicateur est pertinent uniquement lorsqu’un filtre de virtualisation de fichiers est présent.

Valeur de retour

Si la fonction réussit, la valeur de retour est un handle de recherche utilisé dans un appel ultérieur à FindNextFile ou FindClose, et le paramètre lpFindFileData contient des informations sur le premier fichier ou répertoire trouvé.

Si la fonction échoue ou ne parvient pas à localiser des fichiers à partir de la chaîne de recherche dans le paramètre lpFileName, la valeur de retour est INVALID_HANDLE_VALUE et le contenu de lpFindFileData sont indéterminés. Pour obtenir des informations d’erreur étendues, appelez la fonction GetLastError.

Remarques

La fonction FindFirstFileEx ouvre un handle de recherche et retourne des informations sur le premier fichier trouvé par le système de fichiers avec un nom qui correspond au modèle spécifié. Il peut s’agir ou non du premier fichier ou répertoire qui s’affiche dans une application de liste de répertoires (par exemple, la commande dir) lorsqu’il s’agit du même modèle de chaîne de nom de fichier. Cela est dû au fait que FindFirstFileEx ne trie pas les résultats de la recherche. Pour plus d’informations, consultez FindNextFile.

La liste suivante identifie d’autres caractéristiques de recherche :

  • La recherche est effectuée strictement sur le nom du fichier, et non sur des attributs tels qu’une date ou un type de fichier.
  • La recherche inclut les noms de fichiers longs et courts.
  • Une tentative d’ouverture d’une recherche avec une barre oblique inverse de fin échoue toujours.
  • Le passage d’une chaîne non valide, NULL ou une chaîne vide pour le paramètre lpFileName n’est pas une utilisation valide de cette fonction. Les résultats dans ce cas ne sont pas définis.
Remarque Dans de rares cas ou sur un système fortement chargé, les informations d’attribut de fichier sur les systèmes de fichiers NTFS peuvent ne pas être actuelles au moment où cette fonction est appelée. Pour être sûr d’obtenir les attributs de fichier du système de fichiers NTFS actuels, appelez la fonction GetFileInformationByHandle.
 
Si le système de fichiers sous-jacent ne prend pas en charge le type de filtrage spécifié, autre que le filtrage de répertoires, FindFirstFileEx échoue avec l’erreur ERROR_NOT_SUPPORTED. L’application doit utiliser FINDEX_SEARCH_OPS type FileExSearchNameMatch et effectuer son propre filtrage.

Une fois le handle de recherche établi, utilisez-le dans la fonction FindNextFile pour rechercher d’autres fichiers qui correspondent au même modèle avec le même filtrage en cours d’exécution. Lorsque le handle de recherche n’est pas nécessaire, il doit être fermé à l’aide de la fonction FindClose.

Comme indiqué précédemment, vous ne pouvez pas utiliser une barre oblique inverse de fin (\) dans la chaîne d’entrée lpFileName pour FindFirstFileEx, il peut donc ne pas être évident comment rechercher des répertoires racines. Si vous souhaitez afficher des fichiers ou obtenir les attributs d’un répertoire racine, les options suivantes s’appliquent :

  • Pour examiner les fichiers dans un répertoire racine, vous pouvez utiliser « C :\* » et parcourir le répertoire à l’aide de FindNextFile.
  • Pour obtenir les attributs d’un répertoire racine, utilisez la fonction GetFileAttributes.
Remarque Prepending the string « \ ?\\ » n’autorise pas l’accès au répertoire racine.
 

Sur les partages réseau, vous pouvez utiliser un lpFileName sous la forme suivante : « \\server\service\* ». Toutefois, vous ne pouvez pas utiliser un lpFileName qui pointe vers le partage lui-même ; par exemple, « \\server\service » n’est pas valide.

Pour examiner un répertoire qui n’est pas un répertoire racine, utilisez le chemin d’accès à ce répertoire, sans barre oblique inverse. Par exemple, un argument de « C :\Windows » retourne des informations sur le répertoire « C :\Windows », et non sur un répertoire ou un fichier dans « C :\Windows ». Pour examiner les fichiers et les répertoires dans « C :\Windows », utilisez un lpFileName de « C :\Windows\* ».

L’appel suivant :

FindFirstFileEx( lpFileName, 
                 FindExInfoStandard, 
                 lpFindData, 
                 FindExSearchNameMatch, 
                 NULL, 
                 0 );

Équivaut à l’appel suivant :

FindFirstFile( lpFileName, lpFindData );

N’oubliez pas que d’autres threads ou processus peuvent créer ou supprimer un fichier portant ce nom entre le moment où vous interrogez le résultat et l’heure à laquelle vous agissez sur les informations. S’il s’agit d’une préoccupation potentielle pour votre application, une solution possible consiste à utiliser la fonction CreateFile avec CREATE_NEW (qui échoue si le fichier existe) ou OPEN_EXISTING (qui échoue si le fichier n’existe pas).

Si vous écrivez une application 32 bits pour répertorier tous les fichiers d’un répertoire et que l’application peut être exécutée sur un ordinateur 64 bits, vous devez appeler Wow64DisableWow64FsRedirection avant d’appeler FindFirstFileEx et appeler Wow64RevertWow64FsRedirection après le dernier appel à FindNextFile. Pour plus d’informations, consultez redirecteur de système de fichiers.

Si le chemin pointe vers un lien symbolique, la mémoire tampon WIN32_FIND_DATA contient des informations sur le lien symbolique, et non sur la cible.

Dans Windows 8 et Windows Server 2012, cette fonction est prise en charge par les technologies suivantes.

Technologie Supporté
Protocole SMB (Server Message Block) 3.0 Oui
Basculement transparent SMB 3.0 (TFO) Oui
SMB 3.0 avec partages de fichiers avec montée en puissance parallèle (SO) Oui
Cluster Shared Volume File System (CsvFS) Oui
Système de fichiers résilient (ReFS) Oui
 

Exemples

Le code suivant montre une utilisation minimale de FindFirstFileEx. Ce programme équivaut à l’exemple dans la rubrique 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);
   }
}

Note

L’en-tête fileapi.h définit FindFirstFileEx comme alias qui sélectionne automatiquement la version ANSI ou Unicode de cette fonction en fonction de la définition de la constante de préprocesseur UNICODE. Le mélange de l’utilisation de l’alias neutre en encodage avec du code qui n’est pas neutre en encodage peut entraîner des incompatibilités qui entraînent des erreurs de compilation ou d’exécution. Pour plus d’informations, consultez Conventions pour les prototypes de fonction.

Exigences

Exigence Valeur
client minimum pris en charge Windows XP [applications de bureau | Applications UWP]
serveur minimum pris en charge Windows Server 2003 [applications de bureau | Applications UWP]
plateforme cible Windows
d’en-tête fileapi.h (include Windows.h)
bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

FINDEX_INFO_LEVELS

FINDEX_SEARCH_OPS

fonctions de gestion de fichiers

FindClose

FindFirstFile

FindFirstFileTransacted

FindNextFile

GetFileAttributes

nommage d’un de fichier

liens symboliques

à l’aide des en-têtes Windows

WIN32_FIND_DATA