Copier un repertoire avec ses sous répertoire. Fonction qui a l'air ok INSIDE. a

Résolu
cs_opala Messages postés 34 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 19 novembre 2007 - 12 avril 2006 à 11:54
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 12 avril 2006 à 15:22
Bonjour,

Je suis débutant en C. Je cherchais une fonction capable de copier un repertoire avec ses sous repertoire.
J'ai crée ma propre fonction, qui à l'air de marcher. Pour progresser, si vous avez la moindre remarque ou amélioration faites le moi savoir pour que j'adopte dès le début la bonne facon de programmer

//fonction qui va copier le repertoire szPathSource vers szPathDest
int CopyDir (char* szPathSource, char* szPathDest)
{
char* szMyPathSource = NULL;
char* szMyPathDest = NULL;
char* szBuffer = NULL;
WIN32_FIND_DATA MyFile;
HANDLE Myliste;


szMyPathSource = (char*) malloc( sizeof(char)*(strlen(szPathSource)+2) );
szMyPathDest = (char*) malloc( sizeof(char)*(strlen(szPathDest)+2) );


lstrcpy(szMyPathSource,szPathSource);
lstrcpy(szMyPathDest,szPathDest);


if (szMyPathSource [strlen(szMyPathSource) -1] != '\\')
lstrcat(szMyPathSource,"\");
if (szMyPathDest [strlen(szMyPathDest) -1] != '\\')
lstrcat(szMyPathDest,"\");


szBuffer = (char*) malloc( sizeof(char)*(strlen(szMyPathSource)+2) );
lstrcpy(szBuffer,szMyPathSource);
lstrcat(szBuffer,"*");


//On copie colle le contenu du repertoire dans notre repertoire de travail
Myliste = FindFirstFile(szBuffer, &MyFile);
while(FindNextFile(Myliste, &MyFile)) {
char* szSousBufferSource = NULL;
char* szSousBufferDest = NULL;

//si c'est le repertoire courant on ne fait rien
if ( !strcmp(MyFile.cFileName, "..") || !strcmp(MyFile.cFileName, ".") )
continue;


szSousBufferSource = (char*) malloc( sizeof(char)*(strlen(szMyPathSource)+strlen(MyFile.cFileName)+1) );
szSousBufferDest = (char*) malloc( sizeof(char)*(strlen(szMyPathDest)+strlen(MyFile.cFileName)+1) );


lstrcpy(szSousBufferSource,szMyPathSource);
lstrcat(szSousBufferSource,MyFile.cFileName);


lstrcpy(szSousBufferDest,szMyPathDest);
lstrcat(szSousBufferDest,MyFile.cFileName);


// C'est un repertoire on applique la fonction récursive
if( MyFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
// on crée le repertoire
if (mkdir(szSousBufferDest))
return 1;
if (CopyDir (szSousBufferSource,szSousBufferDest))
return 1;
}
else
// C'est un fichier, on copie/colle
if (!CopyFile(szSousBufferSource, szSousBufferDest, FALSE))
return 1;


//on désalloue les buffer
szSousBufferSource = NULL;
szSousBufferDest = NULL;


free(szSousBufferSource);
free(szSousBufferDest);
}
FindClose (Myliste);


szMyPathSource = NULL;
szMyPathDest = NULL;
szBuffer = NULL;


free(szMyPathSource);
free(szMyPathDest);
free(szBuffer);


return 0;
}

4 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
12 avril 2006 à 12:41
la désollacation est mal faite
//on désalloue les buffer
szSousBufferSource = NULL;
szSousBufferDest = NULL;
free(szSousBufferSource);
free(szSousBufferDest);

=> la fonction free est appelée avec des pointeurs NULL

il faut appel free avant de mettre à NULL


free(szSousBufferSource);
free(szSousBufferDest);


szSousBufferSource = NULL;
szSousBufferDest = NULL;

idem pour
free(szMyPathSource);
free(szMyPathDest);
free(szBuffer);
3
cs_opala Messages postés 34 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 19 novembre 2007
12 avril 2006 à 14:33
ok merci

dans mon application principale, j'ai :

char * szNomConfigXML = "Lot_config.xml";

la commande free(szNomConfigXML); fait planter mon appli, est ce normal?

Est t'il de faire un = NULL apres un free?
Exemple:
free(szMachaine);
szMachaine = NULL;
0
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
12 avril 2006 à 14:45
Nan

___________________
MVS - Most Valuable Student ( Microsoft)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
12 avril 2006 à 15:22
c'est normal parce que le pointeur n'a pas été alloué avec malloc (c'est une chaine constante statique en mémoire)
mettre à NULL les variables après les avoir libérer permet de s'assurer qu'on va pas les utiliser par mégarde (un test à NULL permettra alors de pas toucher à la variable).
0
Rejoignez-nous