IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fonction FindFirstFiles & co


Sujet :

C

  1. #1
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut Fonction FindFirstFiles & co
    Bonjour,
    Voila j'ai réaliser avec l'aide d'un de vos membre un cleaner en .bat,
    et mon prof ma dit que pour me marrer je peux le faire en C avec les fonctions : FindNextfiles, FindFirstFiles, FindClose ...

    Helas je ne connais rien sur ces fonctions , j'ai rechercher sur google ou encore sur develloppez ( ou j'ai trouver un tuto en basic apparemment )

    Bref j'aimerais que quelqu'un m'explique comment utiliser ses fonction en détails svp ou me donner un exemple commenté.
    Dans l'idée de partir de la racine pour scruter tout les répertoire jusqu'à trouver un ou des répertoires s'intitulant Debug et l'effacer avec tout ce qui contient, Je voudrait aussi faire la même chose mais avec des fichier (ex: tout les .opt ...)
    J'ai deja regarder la doc de msdn mais j'y comprend pas grand chose.

    SE: Windows XP
    IDE : Code::Blocks

    Je vous met le bout de code que j'ai réaliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include "appli.h"
     
     
     
    int main(void)
    {
      int choix;
      int on_continue=FALSE;
      HANDLE handle;
      WIN32_FIND_DATA data;  //struct d'infomartion du fichier
     
     
      puts("Effacer les fichiers inutiles...................: Taper 1\n\
    Effacer les repertoires Debug seulement.........: Taper 2\n\
    Effacer les fichiers inutiles + Debug...........: Taper 3\n\
    Quitter.........................................: Taper 4\n");
     
    scanf("%d",&choix);
     
      switch(choix)
      {
    		case 1:
     
                handle=FindFirstFile("*.opt",&data);
                if(handle==INVALID_HANDLE_VALUE) Fin("erreur de la fonction FindFirstFiles");
                for(;;)
                {
                    on_continue=FindNextFile(handle,&data);
                    if(on_continue==FALSE) Fin("erreur FindNextFile renvoie FALSE");
                }
     
                 on_continue=FindClose(handle); //fermeture , on libere tout
                 if(on_continue==FALSE) Fin("erreur de FindClose, il renvoie FALSE");
     
     
     
     
                break;
    		case 2:
     
                break;
    		case 3:
     
                break;
     
    		case 4:
                puts("merci d'avoir utilisé ce programme,a bientot!");
                system("pause");
                exit(0);
                break;
    		default:Fin("erreur sur le choix");
      }
     
     
      return 0;
     
    }
    le fichier appli .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // mes includes
    #include <stdio.h>
    #include <windows.h>
    #include <io.h>
    #include <io.h>
     
    // mes defines
    #define FALSE 0
    #define TRUE 1
     
    // mes prototypes
    void Fin(char *);
    le fichier fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "appli.h"
     
    void Fin (char *pMsg)
    {
         puts(pMsg);
         system("pause");
         exit(0);
    }
    Merci beaucoup
    Cordialement
    Ludovic
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour scruter tous les répertoires, c'est plus compliqué (typiquement, ça se fait de manière récursive).
    Voici un exemple de code assez basique :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <tchar.h>
     
    /* Une fonction assez efficace pour combiner deux chemins: O(2*(n+m)).
       Note: Cette fonction est différente de la fonction .Net System.Io.Path::Combine(),
       car elle assemble systématiquement les deux chemins, plutôt que n'utiliser que droit
       si droit commence par un séparateur */
    char * CombinePathA(char const * const gauche, char const * const droit)
    {
    	size_t const cchLongGauche = strlen(gauche);
    	size_t const cchLongDroit = strlen(droit);
    	int const bSeparateurGauche = (cchLongGauche > 0 && (gauche[cchLongGauche-1]=='\\' || gauche[cchLongGauche-1]=='/'));
    	int const bSeparateurDroit = (cchLongDroit > 0 && (droit[0]=='\\' || droit[0]=='/'));
    	/* Supprimer un caractère si séparateur des deux cotés, en ajouter un si aucun séparateur */
    	int const nSeparateurARajouter = (bSeparateurGauche ? 0 : 1) + (bSeparateurDroit ? 0 : 1) - 1;
    	size_t const cchLongBuffer = cchLongGauche + cchLongDroit + nSeparateurARajouter;
    	size_t const cchTailleBuffer = cchLongBuffer + 1;
     
    	char *buffer = malloc(cchTailleBuffer * sizeof(*buffer));
    	if(buffer != NULL)
    	{
    		size_t curIndex = 0;
    		#ifdef _CRT_INSECURE_DEPRECATE
    			/*Version pour Visual 2005*/
    			strcpy_s(buffer + curIndex, cchTailleBuffer-curIndex, gauche);
    			curIndex += cchLongGauche;
    			if(!bSeparateurGauche)
    			{
    				buffer[curIndex++] = '\\';
    				buffer[curIndex] = '\0';
    			}
    			strcpy_s(buffer + curIndex, cchTailleBuffer-curIndex, droit + (bSeparateurDroit ? 1 : 0));
    			curIndex += cchLongDroit - (bSeparateurDroit ? 1 : 0);
    		#else
    			/*Version normale, portable*/
    			strcpy(buffer + curIndex, gauche);
    			curIndex += cchLongGauche;
    			if(!bSeparateurGauche)
    			{
    				buffer[curIndex++] = '\\';
    				buffer[curIndex] = '\0';
    			}
    			strcpy(buffer + curIndex, droit + (bSeparateurDroit ? 1 : 0));
    			curIndex += cchLongDroit - (bSeparateurDroit ? 1 : 0);
    		#endif
    		/*On asserte qu'on a bien rempli le buffer à fond*/
    		assert(curIndex == cchLongBuffer);
    	}
    	return buffer;
    }
     
    void FreePathA(char *del)
    {
    	free(del);
    }
     
    void recherche(char const *cheminDossier)
    {
    	char * cheminJoker = CombinePathA(cheminDossier, "*");
    	if(cheminJoker != NULL)
    	{
    		WIN32_FIND_DATAA donneesSurFichier;
    		HANDLE hFind = FindFirstFileA(cheminJoker, &donneesSurFichier);
    		if(hFind == INVALID_HANDLE_VALUE)
    		{
    			/* Echec */
    			/* ... */
    		}
    		else
    		{
    			BOOL bSuivant;
     
    			/* Début d'analyse du répertoire */
    			/* ... */
     
    			do
    			{
    				/* Fichier trouvé */
    				/* ... */
     
    				if((donneesSurFichier.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=0)
    				{
    					if(strcmp(donneesSurFichier.cFileName, ".")==0 || strcmp(donneesSurFichier.cFileName, "..")==0)
    					{
    						/* Le fichier est un répertoire-lien standard */
    						/* ... */
    					}
    					else
    					{
    						/* Le fichier est un sous-répertoire */
    						char * sousDossier;
    						/* ... */
     
    						sousDossier = CombinePathA(cheminDossier, donneesSurFichier.cFileName);
    						if(sousDossier!=NULL)
    						{
    							recherche(sousDossier);
    							FreePathA(sousDossier);
    						}
    					}
    				}
    				else
    				{
    					/* Le fichier est un simple fichier */
    					/* ... */
    				}
     
    				bSuivant = FindNextFileA(hFind, &donneesSurFichier);
    			}
    			while(bSuivant);
     
    			/* Fin d'analyse du répertoire */
    			/* ... */
     
    			FindClose(hFind);
    		}
    		FreePathA(cheminJoker);
    	}
    }
    Et ici, un exemple qui t'affiche le contenu en question sur la sortie standard (sous une forme plus ou moins XML)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    void recherche2(char const *cheminDossier)
    {
    	char * cheminJoker = CombinePathA(cheminDossier, "*");
    	if(cheminJoker != NULL)
    	{
    		WIN32_FIND_DATAA donneesSurFichier;
    		HANDLE hFind = FindFirstFileA(cheminJoker, &donneesSurFichier);
    		if(hFind == INVALID_HANDLE_VALUE)
    		{
    			/* Echec */
    			printf("<Repertoire chemin=\"%s\" echec=\"%lu\" />\n", cheminDossier, GetLastError());
    		}
    		else
    		{
    			BOOL bSuivant = FALSE;
     
    			/* Début d'analyse du répertoire */
    			printf("<Repertoire chemin=\"%s\">\n", cheminDossier);
     
    			do
    			{
    				/* Fichier trouvé */
    				/* ... */
     
    				if((donneesSurFichier.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=0)
    				{
    					if(strcmp(donneesSurFichier.cFileName, ".")==0 || strcmp(donneesSurFichier.cFileName, "..")==0)
    					{
    						/* Le fichier est un répertoire-lien standard */
    						/* ... */
    						BOOL bParent = (donneesSurFichier.cFileName[1]=='.');
    						/*printf("<LienRepertoire nom=\"%s\" type=\"%s\" />\n", donneesSurFichier.cFileName, (bParent ? "Parent" : "Meme"));*/
    						(void)bParent;
    					}
    					else
    					{
    						/* Le fichier est un sous-répertoire */
    						char * sousDossier;
    						printf("<SousRepertoire nom=\"%s\">\n", donneesSurFichier.cFileName);
     
    						sousDossier = CombinePathA(cheminDossier, donneesSurFichier.cFileName);
    						if(sousDossier!=NULL)
    						{
    							recherche2(sousDossier);
    							FreePathA(sousDossier);
    						}
    						printf("</SousRepertoire>\n");
    					}
    				}
    				else
    				{
    					/* Le fichier est un simple fichier */
    					printf("<Fichier nom=\"%s\" />\n", donneesSurFichier.cFileName);
    				}
     
    				bSuivant = FindNextFileA(hFind, &donneesSurFichier);
    			}
    			while(bSuivant);
     
    			/* Fin d'analyse du répertoire */
    			printf("</Repertoire>\n");
     
    			FindClose(hFind);
    		}
    		FreePathA(cheminJoker);
    	}
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Aie pas facile je vais étudier ces codes et vous tiens au courant.
    merci
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

Discussions similaires

  1. Fonction FindFirstFile aide svp
    Par tlemcen33 dans le forum Débuter
    Réponses: 2
    Dernier message: 29/09/2009, 17h59
  2. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  3. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo