SCANNER DE DISQUES (RECURSIF)

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 2 mai 2006 à 17:08
steph12358 Messages postés 149 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 10 décembre 2009 - 5 juil. 2007 à 15:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37366-scanner-de-disques-recursif

steph12358 Messages postés 149 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 10 décembre 2009 1
5 juil. 2007 à 15:07
Salut à tous

Bon, je sais, ça fait un peu déterrage :0)
mais, je suis tombé sur le code de yoyo qui m'a bien tiré d'affaire.

La fonction originale a été un petit peu modifiée pour en faire une fonction de copie récursive.

code:

void TFormPrincipal::CopieRecursiveFichiers(char *Dossier, char * pdossiercible)
{

/*d'après un code de yoyo269 code original http://www.cppfrance.com/codes/SCANNER-DISQUES-RECURSIF_37366.aspx
*/


HANDLE hRecherche;
WIN32_FIND_DATA WFD;
char * Nom = WFD.cFileName;
char DossFiltre[1024], DossRech[1024], DossCible[1024];
char source[1024], cible[1024];

strcpy(DossFiltre, Dossier);
strcat(DossFiltre, "\");
strcat(DossFiltre, "*.*");
hRecherche = FindFirstFile(DossFiltre, &WFD);

if(hRecherche == INVALID_HANDLE_VALUE)
{
FindClose(hRecherche);
return;
}
do
{
if((WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
if(strcmp(WFD.cFileName, ".") && strcmp(WFD.cFileName, ".."))
{
strcpy(DossRech, Dossier);
strcat(DossRech, "\");
strcat(DossRech, Nom);

strcpy(DossCible, pdossiercible);
strcat(DossCible, "\");
strcat(DossCible, Nom);

//Application->MessageBox(DossCible, "rep CIBLE", MB_OK);

// PLACER LE CODE DE TRAITEMENT ICI, POUR LE DOSSIER "DossRech".
if (! DirectoryExists(DossCible) )
{
mkdir(DossCible);
}
CopieRecursiveFichiers(DossRech, DossCible);
}
}
else
{
sprintf(source, "%s\\%s", Dossier, WFD.cFileName);
sprintf(cible, "%s\\%s", pdossiercible, WFD.cFileName);

sprintf(msg, "CopyFile(%s, %s, false)", source, cible);
CopyFile(source, cible, false);
}
}

while (FindNextFile(hRecherche,&WFD));

FindClose(hRecherche);

}
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
3 mai 2006 à 11:00
Ok merci BruNews !

YOYO, @+.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 mai 2006 à 10:45
*chaine = 0; fait 1 cycle, imbattable
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
3 mai 2006 à 09:12
Ca y est j'ai corrigé le code. (merci vecchio et bayeto)
Qu'est-ce qui est le plus rapide pour remplacer le memset ?
*chaine = 0 ou utiliser directement le strcpy (ou autre chose) ?

YOYO, @+.
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
3 mai 2006 à 03:05
Une boucle do-while ne serait-elle pas plus compacte que le if + while ?
et pour le memset? mettre un *chaine = 0; ou carrement un strcpy
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
2 mai 2006 à 23:24
Ok merci vecchio !
Je vais changer ça.

YOYO, @+.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 mai 2006 à 20:49
Même si on a des dossiers commencant par '.', on peut alléger ton code:
char* p = WFD.cFileName; // p est moins long à écrire
if(!(p[0] == '.' && !p[1]) && !(p[0] == '.' && p[1] == '.' && !p[2]))
{
...
}

Je pense que ca peut encore se simplifier, mais ca risque de devinir illisible
dPompei2 Messages postés 55 Date d'inscription samedi 27 mars 2004 Statut Membre Dernière intervention 1 septembre 2006
2 mai 2006 à 20:42
Laurent1024:
non ce que tu dis est faux, puisque strcmp retourne la différence entre str1 et str2. Donc en cas d'égalité, strcmp retourne 0
ça m'arrive aussi des fois de me tromper avec strcmp, c'est un peu casse c* mais c'est la vie ;)
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
2 mai 2006 à 19:03
par ailleurs if(strcmp(WFD.cFileName, ".") && strcmp(WFD.cFileName, "..")) ca me semble un peu bizarre c'est pas plutot :if(strcmp(WFD.cFileName, ".") || strcmp(WFD.cFileName, ".."))

a++;
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
2 mai 2006 à 18:20
Oui c'est vrai mais j'ai par endroit sur un de mes disques durs, des dossiers cachés de linux et qui commencent donc par un point.
Mais c'est vrai que j'y avais même pas pensé en tous cas merci.

YOYO, @+.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2006 à 17:08
if(strcmp(WFD.cFileName, ".") && strcmp(WFD.cFileName, ".."))
if(WFD.cFileName[0] != '.') autrement plus efficace et bien moins gros en code.
Rejoignez-nous