BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
2 mai 2006 à 17:08
steph12358
Messages postés149Date d'inscriptionjeudi 22 avril 2004StatutMembreDernière intervention10 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.
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 3 mai 2006 à 11:00
Ok merci BruNews !
YOYO, @+.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 3 mai 2006 à 10:45
*chaine = 0; fait 1 cycle, imbattable
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 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és224Date d'inscriptionmardi 12 août 2003StatutMembreDernière intervention18 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és1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 2 mai 2006 à 23:24
Ok merci vecchio !
Je vais changer ça.
YOYO, @+.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és55Date d'inscriptionsamedi 27 mars 2004StatutMembreDerniè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és987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 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és1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
5 juil. 2007 à 15:07
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);
}
3 mai 2006 à 11:00
YOYO, @+.
3 mai 2006 à 10:45
3 mai 2006 à 09:12
Qu'est-ce qui est le plus rapide pour remplacer le memset ?
*chaine = 0 ou utiliser directement le strcpy (ou autre chose) ?
YOYO, @+.
3 mai 2006 à 03:05
et pour le memset? mettre un *chaine = 0; ou carrement un strcpy
2 mai 2006 à 23:24
Je vais changer ça.
YOYO, @+.
2 mai 2006 à 20:49
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
2 mai 2006 à 20:42
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 ;)
2 mai 2006 à 19:03
a++;
2 mai 2006 à 18:20
Mais c'est vrai que j'y avais même pas pensé en tous cas merci.
YOYO, @+.
2 mai 2006 à 17:08
if(WFD.cFileName[0] != '.') autrement plus efficace et bien moins gros en code.