Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Copier un repertoire avec ses sous répertoire. Fonction qui a l'air ok INSIDE. amélioration welcome [ Archives / Fichier / Disque ] (opala)

mercredi 12 avril 2006 à 11:54:50 | Copier un repertoire avec ses sous répertoire. Fonction qui a l'air ok INSIDE. amélioration welcome

opala

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


mercredi 12 avril 2006 à 12:41:41 | Re : Copier un repertoire avec ses sous répertoire. Fonction qui a l'air ok INSIDE. amélioration welcome

ymca2003

Réponse acceptée !
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);


mercredi 12 avril 2006 à 14:33:00 | Re : Copier un repertoire avec ses sous répertoire. Fonction qui a l'air ok INSIDE. amélioration welcome

opala

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;


mercredi 12 avril 2006 à 14:45:00 | Re : Copier un repertoire avec ses sous répertoire. Fonction qui a l'air ok INSIDE. amélioration welcome

Taron31

Membre Club
Nan

___________________
MVS
- Most Valuable Student ( Microsoft)

mercredi 12 avril 2006 à 15:22:14 | Re : Copier un repertoire avec ses sous répertoire. Fonction qui a l'air ok INSIDE. amélioration welcome

ymca2003

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).



Cette discussion est classé dans : repertoire, char, myfile, szmypathsource, szmypathdest


Répondre à ce message

Sujets en rapport avec ce message

Problem avec les .INI [ par Tidam ] voila je debute en c++ et je commence a me servir des .inij'utilise les WritePrivateProfileString , GetPrivateProfileString , etc... de windows.h mais satané pointeur [ par RamS13 ] cette partie de programme bug a l'endroit rosepouvez vous m'éclairer svp.merci d'avance .bool cmp(char* a,char b[]){ int boucle; unsigned int taillea; Listing repertoire recrusif [ par firemax ] Bonjour Mon but est d'ecrire un programme de listing qui list aussi les repertoire , les sous repertoire , les sous sous repertoire et ainsi de suit Comment changer la lecture seul d'un repertoire ? [ par panik6666666 ] Bonjour a tous, J'ai une question bete: comment changer la lecture seul d'un repertoire ? j'ai essayé avec avec ca : HANDLE hFile = CreateFile(nom_r AnsiString en char* [ par lol733 ] Bonjour. Je voudrai savoir si il est possible de transformer un AnsiString en char*. Si oui, si vous pouviez me donner un exemple. Merci. assignment makes integer from pointer without a cast [ par alussk ] Bonjour,ma fonction est censé generée une clé a partir d'un mot de passe donnéquand je compile j'ai deux warning:char keygen(char *fileread, char *pas Convertir unsigned long en const char * [ par sman0 ] bonjour je cherche a convertir un unsigned long en char pour l'afficher dans une MessageBox comment puis-je proceder ? signification de char * * [ par marco_1980 ] Bonsoir a tous,J'aimerais savoir quel est la signification exact de ce parametrevoid main (char  ** arg_vec)et si est-ce que c'est bien correct d'écri Conversion int 2 char [ par DeadStarXt ] Bonjour, Voila, je souhaiterai convertir un entier en chaine de caractère pour l'afficher après manipulation de cette chaine. Coment faire ? Merci Probleme de décimales .. [ par nashoy ] Bonjour,Je commence en c++ et je commence à recontrer les premiers petits bloquages ; en effet, j'ai un petit problème avec les décimales :int b=3;int


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.