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