IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Copier un répertoire dans un autre


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 91
    Points : 47
    Points
    47
    Par défaut Copier un répertoire dans un autre
    Bonjour , j'ai réalisé un ptt programme pour copier les dossiers(fichiers, répertoires)
    d'un répertoire source dans un répertoire cible.
    j'éspere trouver un ptt aide pour l'améliorer car, je réussi à avoir les fichiers dans le répertoire cible mais avec une nomination bisard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
     
    #include <stdio.h>
     
    #include <fcntl.h> 
     
    #include <errno.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <sys/types.h>
     
     
     
    int copier_fichier (char *f_source, char *f_cible)
     
    {
     
    	char buffer[512];
     
        	int fd1, fd2, n;
     
    	strcat(f_cible,f_source);
     
     
     
        	//Ouvrir le fichier à copier en lecture
     
     
     
        	fd1=open (f_source , O_RDONLY);
     
     
     
       	 // Creer et ouvrir le fichier "titi.txt" en ecriture
     
        	fd2=open (f_cible , O_CREAT|O_WRONLY|O_TRUNC,0666);
     
       	 while((n=read(fd1,buffer,512))>0)
     
        	{
     
        	write(fd2,buffer,n);
     
        	}
     
     
     
        	close(fd1);
     
       	close(fd2);
     
    return 0;
     
     
     
    }
     
     
    int copier_dir (char *r_source, char *r_cible)
     
    {
     
     
    	struct dirent *lecture;
    	DIR *rep1,*rep2;
    	strcat( r_cible,"/");
     
    	// Ouvrir le réperoire source
    	rep1 = opendir(r_source);
     
     
    	// Ouvrir le répertoire source
    	rep2 = opendir(r_cible);
     
     
    	while ((lecture = readdir(rep1)))
       	 {
    		struct stat st;
     		stat (lecture->d_name, &st);
     
    		if (!strcmp (lecture->d_name, "." ))
                 	continue;
             	if (!strcmp (lecture->d_name, ".." )) 
    		continue;
     
    		//if (S_ISDIR(st.st_mode)) // répertoire
    	        //copier_dir(lecture->d_name,lecture->d_name);
     
    		if (S_ISREG(st.st_mode))// fichier régulier
    		{
     
    		printf("%s\n",r_cible);
    		copier_fichier(lecture->d_name,r_cible);
    	       }
    	}
     
     
    return 0;
    }
     
    void main (int argc, char * argv[])
     
    {
    	copier_dir(argv[1],argv[2]);
    }

    pour printf("%s",r_cible);

    j'ai le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    ./tmp1/
    ./tmp1/copier-rep.c~
    ./tmp1/copier-rep.c~copier
    ./tmp1/copier-rep.c~copiercopier_rep.c~
    ./tmp1/copier-rep.c~copiercopier_rep.c~newrep
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprep
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.c
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txt
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_file
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_filecopier.c
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_filecopier.ctatos.tx
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_filecopier.ctatos.txlister
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_filecopier.ctatos.txlistertype_file.c
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_filecopier.ctatos.txlistertype_file.clister.c~
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_filecopier.ctatos.txlistertype_file.clister.c~lister.c
    ./tmp1/copier-rep.c~copiercopier_rep.c~newreprepcopier_fichier.c~copier_fichier.cmourad.txttype_file.c~mourad~type_filecopier.ctatos.txlistertype_file.clister.c~lister.ccopier.c~

    alors que je veux avoir un résultat comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ./tmp1/copier_rep.c
    ./tmp1/copier.c
    ./tmp1/lister.c
    ./tmp1/tmp
    ....
    Merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    • primo aucune vérification si tout s'est bien passé (opendir, stat, etc etc..)

    • secondo, strcmp n'EST PAS UN BOOLEEN. Tester
      est la vraie forme

    • tertio, tu fais un strcat sur une chaine constante définie par le sysème (argv[2], r_cible). Passe par une chaine intermédiaire, si tu veux, ou fais-le directement à la fin

    • Quarto, à chaque passe tu fais un strcat dans r_cible, ce qui l'augmente en permanence, plus la remarque ci-dessus..

    • Cinque, main retourne un int, TOUJOURS


    Une vraie solution serait :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    int copier_fichier (char *f_source, char *f_cible)
     
    {
    	char buffer[512], *tmp=NULL;
        	int fd1, fd2, n;
     
             tmp = malloc ( (strlen(f_cible)+strlen(f_source)+2) );
             if ( tmp == NULL )
                return 1 ;
     
    	sprintf(tmp, "%s/%s", f_cible,f_source);
     
        	//Ouvrir le fichier à copier en lecture
        	fd1=open (f_source , O_RDONLY);
             if ( fd1 == NULL )
               {
                  free(tmp);
                  return 1 ; 
               }
     
       	 // Creer et ouvrir le fichier "titi.txt" en ecriture
        	fd2=open (buffer , O_CREAT|O_WRONLY|O_TRUNC,0666);
             free(tmp);
             if ( fd2 == NULL )
               {
                  fclose(fd1);
                  return 1 ;
               }
     
       	 while((n=read(fd1,buffer,512))>0) 
        	{
        	write(fd2,buffer,n);
        	}
     
        	close(fd1); 
       	close(fd2);
     
    return 0; 
    }
     
     
    int copier_dir (char *r_source, char *r_cible)
    {
    	struct dirent *lecture;
    	DIR *rep1,*rep2;
                 int s=0 ;
     
    	// Ouvrir le réperoire source
    	rep1 = opendir(r_source);
            if ( rep1 == NULL )
               return 1 ; 
     
    	// Ouvrir le répertoire source
    	rep2 = opendir(r_cible);
            if ( rep2 == NULL )
              {
                  closedir(rep1);
                  return 1 ;
               }
     
    	while ((lecture = readdir(rep1)) != NULL)
       	 {
    		struct stat st;
     		stat (lecture->d_name, &st);
     
    		if (strcmp (lecture->d_name, "." ) == 0)
                 	continue;
                    if (strcmp (lecture->d_name, ".." ) == 0) 
    		 continue;
     
    		//if (S_ISDIR(st.st_mode)) // répertoire
    	        //copier_dir(lecture->d_name,lecture->d_name);
     
    		if (S_ISREG(st.st_mode))// fichier régulier
    		{
    		   printf("%s\n",r_cible);
                       if ( copier_fichier(lecture->d_name,r_cible) != 0 )
                       {
                         fprintf ( stderr, "Ooops !! n'ai pas pu copier fichier %s\n", lecture->d_name);
                         s = 1 ;
                       }
    	       }
    	}
     
    return s;
    }
     
    int main (int argc, char * argv[])
     
    {
        if ( copier_dir(argv[1],argv[2]) != 0 )
          {
              fprintf ( stderr, "OOOPPSS . Une ereur s'est produite à un moment donné...\n");
              return 1 ;
          }
        else
             return 0 ;
    }

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    souviron34 :
    tertio, tu fais un strcat sur une chaine constante définie par le sysème (argv[2], r_cible).
    La chaîne est modifiable, mais je ne pense pas qu'elle soit automatiquement extensible

    N1124 :
    5.1.2.2.1 Program startup
    ...
    2
    ....
    - The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    souviron34 : La chaîne est modifiable, mais je ne pense pas qu'elle soit automatiquement extensible

    N1124 :
    oui c'est ce que je voulais dire, je me suis mal exprimé

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/02/2009, 17h51
  2. Copier récursivement un répertoire dans un autre
    Par TSP05 dans le forum Langage
    Réponses: 1
    Dernier message: 05/10/2008, 12h23
  3. copier une table dans une autre
    Par Dionisos dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/07/2005, 11h24
  4. Copier une texture dans une autre?
    Par supergrey dans le forum DirectX
    Réponses: 9
    Dernier message: 28/07/2004, 11h12
  5. copier une ligne dans une autre table
    Par BoeufBrocoli dans le forum SQL
    Réponses: 5
    Dernier message: 24/10/2003, 22h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo