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 ficher vers un dossier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Par défaut Copier un ficher vers un dossier
    Bonjour , je voulais savoir comment on peut copier un fichier vers un dossier ou sous dossier, j'ai fait la fonction pour copier coller un fichier donc ça va , copier un répertoire et ses sous fichiers c'était une correction mais en revanche faire d'un fichier à un répertoire je vois pas.Si l'on pouvait m'éclairer je vous en remercierait grandement.


    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
     
    #define	MAXBUF	1024
    #define	MAXLINE	1024
    #define	D_FMODE	0666
    #define	D_DMODE	0777
     
    int copie (int fs, int fd)
    {
      char buf[MAXBUF];
      int n;
     
      while ((n = read (fs, buf, MAXBUF)) > 0)
        if (write (fd, buf, n) != n)
          return -1;
      return n;			/* -1 ou 0 */
    }
     
    int copier (char source[], char dest[])
    {
      int fs, fd;
      int n;
     
      fs = open (source, O_RDONLY);
      if (fs == -1)
        return -1;
     
      fd = open (dest, O_WRONLY | O_CREAT | O_TRUNC, D_FMODE);
      if (fd == -1)
      {
        close (fs);
        return -1;
      }
     
      n = copie (fs, fd);
     
      close (fs);
      close (fd);
     
      return n;
    }
     
    int copier_arbre (char source[], char dest[]);
    int copier_repertoire (char source[], char dest[])
    {
      DIR *dp;
      struct dirent *d;
      char *ps, *pd;
     
      dp = opendir (source);
      if (dp == NULL)
        return -1;
      if (mkdir (dest, D_DMODE) == -1)
        return -1;
     
      ps = source + strlen (source);
      *ps++ = '/';
      pd = dest + strlen (dest);
      *pd++ = '/';
     
      while ((d = readdir (dp)) != NULL)
      {
        if (d->d_ino != 0 && strcmp (d->d_name, ".") != 0 &&
    	strcmp (d->d_name, "..") != 0)
        {
          strcpy (ps, d->d_name);
          strcpy (pd, d->d_name);
          if (copier_arbre (source, dest) == -1)
    	return -1;
        }
      }
     
      closedir (dp);
      *(ps - 1) = *(pd - 1) = '\0';
     
      return 0;
    }
     
    int copier_arbre (char source[], char dest[])
    {
      struct stat stbuf;
      int n;
     
      if (stat (source, &stbuf) == -1)
        return -1;
     
      switch (stbuf.st_mode & S_IFMT)
      {
      case S_IFREG:
        n = copier (source, dest);
        break;
      case S_IFDIR:
        n = copier_repertoire (source, dest);
        break;
      default:
        fprintf (stderr, "%s : invalid file type\n", source);
        n = -1;
        break;
      }
      return n;
    }
     
    int main (int argc, char *argv[])
    {
      char source[MAXLINE], dest[MAXLINE];
     
      if (argc != 3)
      {
        fprintf (stderr, "usage: %s <source> <dest>\n", argv[0]);
        exit (1);
      }
      strcpy (source, argv[1]);
      strcpy (dest, argv[2]);
     
      if (copier_arbre (source, dest) == -1)
      {
        perror ("");
        exit (1);
      }
      exit (0);
    }

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Eh bein...

    Si tu copies vers un dossier, il faut voir les specs que l'on t'a demandé ou que tu t'imposes.
    Moi je vais te proposer ça :

    ./monprog source dest

    - Si dest finit par "/", alors ça doit être un dossier et on utilise le même nom de fichier qu'en entrée
    - Si dest ne finit PAS par "/", alors on vérifie si c'est un fichier OU un dossier
    => si c'est un fichier, on copie depuis la source vers la destination
    => si c'est un dossier, on fait comme s'il finissait par "/" (donc on créer un fichier dedans et on le rempli)

    A toi de voir ce que tu veux faire si on te donne un dossier contenant déjà le même nom de fichier qu'en entrée...

    PS : N'oublie pas de retirer les "/" de la chaîne de caractère en source...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 28
    Par défaut
    ok donc je cherche le type de dest grace à stat puis je le concatène à / pour avoir un dossier.Si c'est un dossier exemple test/
    C'est la suite ou je suis actuellement coincé.

    J'ai fait cecis : /* la ou y'a des modifs */
    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
    int copier (char source[], char dest[])
    {
      int fs, fd;
      int n;
     
      fs = open (source, O_RDONLY);
      if (fs == -1)
        return -1;
     /* struct stat stbuf; 
      
      if (stat (dest, &stbuf) == -1)
        return -1;
        
      char *pd;
        
      pd = dest + strlen (dest);
      *pd++ = '/';  */
     
      fd = open (dest, O_WRONLY | O_CREAT | O_TRUNC, D_FMODE);
      if (fd == -1)
      {
        close (fd);
        return -1;
      }
     
      n = copie (fs, fd);
     
      close (fs);
      close (fd);
     
      return n;
    }

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Metalman Voir le message
    - Si dest finit par "/", alors ça doit être un dossier et on utilise le même nom de fichier qu'en entrée
    - Si dest ne finit PAS par "/", alors on vérifie si c'est un fichier OU un dossier
    => si c'est un fichier, on copie depuis la source vers la destination
    => si c'est un dossier, on fait comme s'il finissait par "/" (donc on créer un fichier dedans et on le rempli)
    Salut
    Perso je pense que la règle n° 1 est de trop et est avantageusement comblée par le test "dossier <=> fichier". Surtout si l'appelant se trompe et met un "/" final en trop...

    Citation Envoyé par walase Voir le message
    ok donc je cherche le type de dest grace à stat puis je le concatène à / pour avoir un dossier.Si c'est un dossier exemple test/
    C'est la suite ou je suis actuellement coincé.

    J'ai fait cecis : /* la ou y'a des modifs */
    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
    int copier (char source[], char dest[])
    {
      int fs, fd;
      int n;
    
      fs = open (source, O_RDONLY);
      if (fs == -1)
        return -1;
     /* struct stat stbuf; 
      
      if (stat (dest, &stbuf) == -1)
        return -1;
        
      char *pd;
        
      pd = dest + strlen (dest);
      *pd++ = '/';  */
    
      fd = open (dest, O_WRONLY | O_CREAT | O_TRUNC, D_FMODE);
      if (fd == -1)
      {
        close (fd);    // Erreur ici
        return -1;
      }
    
      n = copie (fs, fd);
    
      close (fs);
      close (fd);
      
      return n;
    }
    Je pense que ta fonction est mal découpée. En effet, tu groupes le test avec l'ouverture et tu délègues la copie proprement dite (soit une simple boucle) à une autre fonction.
    Sauf si t'as vraiment besoin de ce découpage (par exemple si tu veux copier un stream) tu devrais plutôt laisser la copie dans la fonction mais déléguer le test et la création du nom à une autre fonction.

    Exemple
    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
    int copier (char source[], char dest[])
    {
      int fs, fd;
      char data[32000];
      int nb;
     
      fs = open (source, O_RDONLY);
      if (fs == -1)
        return -1;
     
      fd = open (dest, O_WRONLY | O_CREAT | O_TRUNC, D_FMODE);
      if (fd == -1)
      {
        close (fs);
        return -1;
      }
     
      while ((nb=read(fs, data, 32000)) > 0)
            write(fd, data, nb);
     
      close (fs);
      close (fd);
     
      return 1;
    }
    Ainsi, la fonction appelante n'aura qu'à créer le nom du fichier dest et appeler copier(orig, dest).

    Quand à concaténer deux noms séparés par un "/", ça se fait très facilement avec sprintf()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Copier les fichiers vers un dossier
    Par charrynsasi dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 09/04/2013, 15h02
  2. [Débutant] Copier des éléments vers un dossier
    Par hmoad dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 01/08/2012, 13h33
  3. copier feuille classeur vers un dossier ayant chemin dans celulle
    Par VELO1222 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/01/2011, 13h08
  4. Copier un fichier vers un autre dossier
    Par kofky0 dans le forum VBScript
    Réponses: 4
    Dernier message: 22/08/2007, 11h50
  5. Copier un fichier d'un dossier vers un autre
    Par rvaysse dans le forum VB.NET
    Réponses: 10
    Dernier message: 13/08/2007, 15h33

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