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