begin process at 2012 05 29 01:09:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Fichier / Disque

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

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ée 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...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,153 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales