Logo Atlence.com

Publicité - Nos sponsors !
RSS | * Plan | * Nos logiciels | * Notre cédérom | * Licence commerciale | * Lettre d'infos | * FAQ | * Contact
       
Nos logiciels 
* Questions Réponses
* Questionnaires
* Calcul de Résistances
* Justal'heure
* EuroFranc
* Farces & Attrapes
* Jeux Bidouilles
* Tous nos logiciels
* Nos logiciels sur CD-ROM
 
Programmation 
* Logiciels utilisés
* Codes sources
* Articles et astuces
* Liens utiles
 
Divers 
* La boîte à astuces
* Nos récompenses
* À propos du site
* Lettre d'infos
* Partenariat
* Liens partenaires

* Nous contacter
 
 

Accueil Accueil >> Programmation >> Articles et astuces >> Recherche de fichiers'

Rechercher un fichier sur le disque dur avec Visual C++®

Introduction

Il est souvent utile de savoir rechercher l'existence d'un ou de plusieurs fichiers sur un disque, par exemple pour implanter au sein d'un programme la possibilité de lister les fichiers présents dans un dossier.
Cet article explique comment implanter une telle fonction, et pour ceux qui veulent aller plus loin, détaille la méthode pour faire la même chose avec une connexion FTP afin de lister les fichiers présents sur un serveur FTP.

Les fonctions API

Windows® fournit plusieurs fonctions utiles pour rechercher des fichiers sur un disque donné, en fonctions de critères (attributs de fichiers,...). Ces fonctions sont :

HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData);
BOOL FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);
BOOL FindClose(HANDLE hFindFile);

La première fonction, FindFirstFile permet d'initialiser la recherche. Cette fonction renvoie une valeur (hFindFile) qui pourra être utilisée pour accéder aux fichiers suivants qui correspondent aux critères donnés. Si vous souahitez rechercher plusieurs fichiers, la fonction FindNextFile est utilisée ensuite pour accéder succesivement aux autres fichiers répondant aux critères. Enfin, la fonction FindClose permet de cloturer la recherche en libérant la mémoire allouée à la recherche.
La structure lpFindFileData contient de nombreux renseignements sur le fichier trouvé : son nom, ses attribtus, ...
Lorsque vous spécifiez "*.*" dans le paramètre lpFileName de la fonction FindFirstFile, Windows® envoie la liste de tous les fichiers du répertoire courant ainsi que tous les dossiers contenus dans ce dossier, ce qui peut être utile pour lister uniquement les dossiers.

Lister le contenu d'un dossier

L'exemple qui suit affiche la liste de tous les fichiers contenus dans un dossier donné :


void AfficherListeFichiers (char Dossier[MAX_PATH])
{
HANDLE hFind;
WIN32_FIND_DATA FindData;

// Change de dossier
SetCurrentDirectory (Dossier);

// Début de la recherche
hFind=FindFirstFile ("*.*", &FindData);
if (hFind!=INVALID_HANDLE_VALUE)
{
// Si le fichier trouvé n'est pas un dossier mais bien un fichier, on affiche son nom
if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
MessageBox (NULL, FindData.cFileName, "Fichier", MB_ICONINFORMATION);
}
// Fichiers suivants
while (FindNextFile (hFind, &FindData))
{
if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
MessageBox (NULL, FindData.cFileName, "Fichier", MB_ICONINFORMATION);
}
}
}
// Fin de la recherche
FindClose (hFind);
}

Remarque : en supprimant les deux '!' dans le code précédent, vous obtiendrez la liste des dossiers inclus dans le dossier courant.

Les classes MFC

MFC facilite encore davantage le code pour rechercher des fichiers, avec la classe CFileFind.
Le code ci-dessous reprend les mêmes fonctionnalités que le précédent, mais en utilisant les classes MFC :

void AfficherListeFichiers (CString Dossier)
{
CFileFind Find;

// Change de répertoire
SetCurrentDirectory (Dossier);

// Début de la recherche
BOOL bWorking=Find.FindFile ("*.*");
// Si le fichier trouvé n'est pas un dossier mais bien un fichier, on affiche son nom
while (bWorking)
{
bWorking = Find.FindNextFile();
if (!Find.IsDirectory ())
{
AfxMessageBox (Find.GetFileName ());
}
}
// Fin de la recherche
Find.Close ();
}

Comme vous pouvez le constater, les variables hFind et FindData précédemment définies sont ici automatiquement prises en charge par la classe CFileFind, ce qui nous facilite la tâche !
Remarque : la classe CFileFind suppose que vous avez appelé au moins une fois la fonction FindNextFile avant d'appeler la fonction GetFileName, donc la différence dans la boucle while par rapport au code précédent.

Pour aller plus loin

Si vous utilisez les classes MFC, sachez qu'une classe presque similaire à la classe CFileFind existe pour effectuer les même opérations sur des fichiers et dossiers stockés sur un serveur FTP.
La classe CFtpFileFind s'utilise de la même façon que CFileFind !
Le code ci-dessous liste les fichiers contenu dans un dossier d'un serveur FTP :

void AfficherListeFichiers ()
{
CFtpConnection * pFtpConnection;
CInternetSession Session;

// Connexion FTP
pFtpConnection = NULL;
try
{
pFtpConnection = Session.GetFtpConnection("ftp.club-internet.fr","Anonymous","anomymous@",INTERNET_INVALID_PORT_NUMBER);
}
catch(CInternetException *pEx)
{
pEx->ReportError(MB_ICONEXCLAMATION);
pFtpConnection = NULL;
pEx->Delete();
return;
}
CFtpFileFind Find(pFtpConnection);

// Change de répertoire
pFtpConnection->SetCurrentDirectory ("pub/unix/linux/Mandrake/iso/");

// Début de la recherche
BOOL bWorking=Find.FindFile ("*.*");
// Si le fichier trouvé n'est pas un dossier mais bien un fichier, on affiche son nom
while (bWorking)
{
bWorking = Find.FindNextFile();
if (!Find.IsDirectory ())
{
AfxMessageBox (Find.GetFileName ());
}
}
// Fin de la recherche
Find.Close ();

// Fin connexion FTP
Session.Close();
pFtpConnection->Close();
if(pFtpConnection!=NULL)
delete pFtpConnection;
}

Liens utiles

  • Source d'un programme complet pour rechercher un texte dans un fichier
    Téléchargez-le
 
Tâches spécifiques 
* Découvrir nos articles/astuces
* Télécharger nos sources
* Les logiciels que nous utilisons
* Afficher des liens utiles
* Nous envoyer vos commentaires
 
Actualités 

31/12/07

* Nous vous souhaitons une très bonne année 2008, meilleurs voeux de succès.
* En savoir plus...


29/10/07

* Spécial Halloween : piegez vos amis !

Frissons garantis pour eux... et fous-rires pour vous !

Téléchargez vite Farces et Attrapes
* En savoir plus...


17/02/06

* Nouvelle version 2.1 de Justal'heure qui améliore l'ergonomie du programme.
* En savoir plus...


* Toutes les nouveautés

 
Téléchargements 
* Les nouveautés
* Les plus téléchargés
* Pilotes & routines
* Aide et conseils

* Tous les téléchargements
 
 
 

Copyright © 2001-2008 Thomas et Mathieu DUBAËLE - Tous droits réservés
Toute reproduction, même partielle, est strictement interdite sans autorisation.
Dernière mise à jour de la page : 12/09/2005


Publicité - Nos sponsors !