Fonction FindFirstFileA (fileapi.h)
Recherche un répertoire pour un fichier ou un sous-répertoire avec un nom qui correspond à un nom spécifique (ou un nom partiel si des caractères génériques sont utilisés).
Pour spécifier des attributs supplémentaires à utiliser dans une recherche, utilisez la fonction FindFirstFileEx.
Pour effectuer cette opération en tant qu’opération transactionnelle, utilisez la fonction FindFirstFileTransacted.
Syntaxe
HANDLE FindFirstFileA(
[in] LPCSTR lpFileName,
[out] LPWIN32_FIND_DATAA lpFindFileData
);
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 disposer d’autorisations d’accès à la racine et à tous les sous-répertoires sur le chemin d’accès.
Par défaut, le nom est limité à MAX_PATH caractères. Pour étendre cette limite à 32 767 caractères larges, ajoutez « \\ ?\ » au chemin d’accès. Pour plus d’informations, consultez nommage des fichiers, des chemins d’accès et des espaces de noms.
Pourboire
À compter de Windows 10, version 1607, vous pouvez choisir de supprimer la limitation MAX_PATH sans précéder « \\ ?\ ». Pour plus d’informations, consultez la section « Limite maximale de longueur de chemin » de noms, fichiers, chemin s et espaces de noms.
[out] lpFindFileData
Pointeur vers la structure WIN32_FIND_DATA qui reçoit des informations sur un fichier ou un répertoire trouvé.
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
Si la fonction échoue, car aucun fichier correspondant n’est trouvé, la fonction GetLastError retourne ERROR_FILE_NOT_FOUND.
Remarques
La fonction FindFirstFile 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 FindFirstFile 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 (pour d’autres options, voir FindFirstFileEx).
- 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.
Lorsque le handle de recherche n’est plus nécessaire, fermez-le à 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 FindFirstFile, 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.
Sur les partages réseau, vous pouvez utiliser un lpFileName sous la forme suivante : « \\Server\Share\* ». Toutefois, vous ne pouvez pas utiliser un lpFileName qui pointe vers le partage lui-même ; par exemple, « \\Server\Share » 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\* ».
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
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 la fonction
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
L’exemple C++ suivant montre une utilisation minimale 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);
}
}
Pour obtenir un autre exemple, consultez Listing the Files in a Directory.
Note
L’en-tête fileapi.h définit FindFirstFile 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 |