begin process at 2012 02 13 01:17:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > RECHERCHER UN FICHIER SUR LE DISQUE DUR AVEC VISUAL C++

RECHERCHER UN FICHIER SUR LE DISQUE DUR AVEC VISUAL C++


 Information sur la source

Note :
5 / 10 - par 3 personnes
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Niveau :Débutant Date de création :16/07/2004 Vu :10 029

Auteur : appstmd

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

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 répertoire. 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
if (Find.FindFile ("*.*"))
{
// Si le fichier trouvé n'est pas un dossier mais bien un fichier, on affiche son nom
while (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","A nonymous","anomymous@",INTERNET_INVALID_PORT_NUMBE R);
}
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
if (Find.FindFile ("*.*"))
{
while (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;
}

Source

  • 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);
  • }
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); 
} 

 Conclusion

Pour un article plus complet : http://www.atlence.com/programs/cpp_search.php

Pour nous faire part de vos remarques : programmation@atlence.com

Pour un exemple d'utilitaire fourni avec ses sources utilisant ce principe : http://www.atlence.com/programs/sources.php


 Sources du même auteur

Source avec Zip Source avec une capture PROG COMPLET QUI RECHERCHE UN TEXTE DANS TOUS LES FICHIERS T...

 Sources de la même categorie

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty

Commentaires et avis

Commentaire de Urgo le 17/07/2004 00:59:23

Bien écrit, mais le titre de la source est mensonger! Tu ne fais ici que lister.

"MFC facilite encore davantage le code" => pas du tout d'accord, enfin doit dépendre des personnes interrogées.
Moi je n'ai pas encore trouvé un seul avantage pour utiliser les MFC!

Commentaire de vecchio56 le 17/07/2004 09:35:24 administrateur CS

Ca va quand même plus vite (à coder)

Commentaire de djl le 17/07/2004 12:27:05

void AfficherListeFichiers (char Dossier[MAX_PATH])

pas obliger de preciser la taille, c'est un pointeur qui est passer en parametre

Commentaire de lordnecron le 07/09/2004 17:55:01

Je me demande si l'algo est erroné, si l'API est bugguée ou bien si je n'ai pas les yeux en face des trous, mais il me semble que la fonction liste tous les fichiers moins un !
Si le répertoire contient 6 fichiers, on en obtient que 5, s'il en contient un, on obtient RIEN...

Des explications ?

Commentaire de vecchio56 le 07/09/2004 18:01:20 administrateur CS

l'API n'est pas bogguée, ca c'est sur.

Commentaire de lordnecron le 08/09/2004 10:30:30

J'utilise la version MFC de son code...
Voici mon algo :

void CDialogDistancier::OnTest()
{
CFileFind Find;
CString Dossier ="d:/JUB/";
// Change de répertoire
SetCurrentDirectory (Dossier);
// Début de la recherche
if (Find.FindFile ("*.*"))
{
while (Find.FindNextFile ()){
AfxMessageBox (Find.GetFileName ());
}
}
// Fin de la recherche
Find.Close ();
}

En tout et pour tout, j'affiche les  "." et ".."
Jamais mon fichier "Carte1.gcm" qui se trouve dans le répertoire "d:/JUB" et qui s'y trouve seul.

C'est hallucinant... j'me demande bien ou je merde...

Commentaire de djl le 08/09/2004 10:33:37

faudrais pas plutot faire

if (Find.FindFile ("*.*"))
{
do {
AfxMessageBox (Find.GetFileName ());
} while (Find.FindNextFile ());
}

?

Commentaire de appstmd le 03/10/2004 21:42:51

Merci pour les messages ; le code n'était effectivement pas bon.

Voici un exemple d'utilisation trouvé sur MSDN : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cfilefind.asp

Notre code a été mis à jour, vous le trouverez à la page : http://www.atlence.com/index.php?page=prg_cppsearch

Commentaire de sexy_developpeuse le 09/05/2005 16:57:47

en fait le code de recherche sur un serveur ftp ne marche pas tres correctement apres execution j'ai un bug d'assertion du genre debug assertion failed dans le fichiers afxxin1.inl et je sais pas comment faire fasse?

Commentaire de appstmd le 17/05/2005 20:54:38

Salut !

Vérifie d'abord que tu as une connexion Internet active, sinon ça risque de planter. Et de spécifier également une adresse IP valide !! Peut-être que l'adresse que j'ai donné dans l'exemple n'est plus valide !!!

Commentaire de Lancelot965 le 31/05/2005 17:41:55

Attention!

La fct "FindFirstFile" est ambigüe car elle ne permet pas de traverser un dossier sur lequel vous n'avez pas de droit de lecture ou de "listage". Pourtant, même sans avoir aucun droit sur le dossier il est possible de lister son contenu avec la fonction CreateFile (à condition qu'il y ait au moins un fichier accessible en lecture dans le dossier).

Par conséquent, contrairement à ce qui est dit en début d'article, il ne faut pas utiliser cette fct pour tester l'existence de fichiers, il faut utiliser "CreateFile".

exemple: c:\dossier1\test.txt
- dossier1: aucun droit (NTFS)
- test.txt: tous les droits (non héritage des droits de "dossier1" donc)
Essayez la fct CreateFile et vous constaterez que vous pourrez lire le fichier, écrire dedans, le copier dans un autre dossier, etc...

Commentaire de anonyme_man_in_this_world le 01/07/2005 16:57:10

salut  !!
comment lister les disque dur

A+

Commentaire de vecchio56 le 03/07/2005 16:57:38 administrateur CS

http://www.cppfrance.com/code.aspx?ID=28413

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,527 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales