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++Builder Discussion :

Fonctions permettant la copie d'un répertoire


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut Fonctions permettant la copie d'un répertoire
    Bonjour,

    J'ai créé une fonction pour copier une liste de fichiers d'un répertoire, vers un autre répertoire, en écrasant les anciens fichiers du répertoire de destination.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void __fastcall CopierFichiers(String rep_source, String rep_dest)
    {
         SHFILEOPSTRUCT FileOpStr;
         ZeroMemory(&FileOpStr, sizeof(FileOpStr));
         FileOpStr.hwnd = Application->Handle;
         FileOpStr.fFlags = FOF_NOCONFIRMATION;
         FileOpStr.wFunc = FO_COPY;
         FileOpStr.pFrom = rep_source.c_str();
         FileOpStr.pTo = rep_dest.c_str();
         SHFileOperation(&FileOpStr);
    }
    Je l'utilise ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopierFichiers("C:\\Un rep bidon\\fichiers\\*.*", "E:\\Une destination");
    J'ai beau changer le répertoire d'entrée, de sortie, les anti-slashs, étoiles, etc etc... A chaque fois, il me répond "Impossible de copier fichier : impossible de lire à partir du fichier source ou de la disquette".

    Le plus étonnant, c'est que l'utilisation de cette fonction dans un autre programme fonctionnait SANS AUCUN PROBLEME, et que je réussisais bien à copier un répertoire et ses sous-répertoires dans un autre répertoire.

    Que faire ? Auriez-vous des idées concernant ce problème ? Ou peut-etre connaissez-vous une autre fonction pour copier le contenu entier d'un répertoire dans un autre ?

    Merci par avance !!

  2. #2
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Et plus... je viens de tenter de faire la fonction différemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void __fastcall CopierFichiers(String rep_source, String rep_dest)
    {
    TSearchRec Fichier; 
     
    if(FindFirst(rep_source+"*.*", faAnyFile, Fichier) == 0)
    {
            do
                    CopyFile(String(rep_source + Fichier.Name).c_str(), rep_dest.c_str(), false);
            while(FindNext(Fichier) == 0); 
            FindClose(Fichier); 
    }
    }
    ça ne marche pas mieux, CopyFile renvoie 0 à chaque fois et ne me copie rien du tout !!! Alors que si je copie les fichiers à la main dans l'explorateur Windows... ça fonctionne sans problème...

    D'où cela peut-il venir ?!

    Merci pour vos idées !!

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    J'ai testé tes méthodes
    la 1ère méthode classique tout est ok, elle fonctionne corectement je vois pas où se situe le problème ( surement sur tes fichiers )
    la seconde fonctionne aussi tu as juste omis de préciser le nom du fichier dans ton CopyFile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    , (rep_dest+ Fichier.Name).c_str(),
    voila ...

  4. #4
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci, je n'avais pas vu cette erreur dans la 2ème fonction !

    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
    void __fastcall CopierFichiers(String rep_source, String rep_dest)
    {
    TSearchRec Fichier; 
     
    if(FindFirst(rep_source+"*.*", faAnyFile, Fichier) == 0)
    {
            do
            {
                    if(String(Fichier.Name).Length()>2)
                            CopyFile(String(rep_source + Fichier.Name).c_str(), String(rep_dest + Fichier.Name).c_str(), false);
            }
            while(FindNext(Fichier) == 0);
            FindClose(Fichier); 
    }
     
    }
    Bon, j'utiliserai celle-ci puisqu'elle fonctionne, mais je ne comprends pas malgré tout pourquoi la 1ere fonction renvoyait toujours ce message d'erreur...

  5. #5
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    J'ai changé 2-3 choses dans ma fonction pour qu'elle soit récursive et qu'elle copie les fichiers dans tous les sous-répetoires du répertoire donné... Pour ceux que ça intéresse :

    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
     
    void __fastcall CopierFichiers(String rep_source, String rep_dest)
    {
    TSearchRec Fichier;
     
    if(FindFirst(rep_source+"*.*", faAnyFile, Fichier) == 0)
    {
       do
       {
          CopyFile(String(rep_source + Fichier.Name).c_str(), String(rep_dest + Fichier.Name).c_str(), false);
          if ((Fichier.Attr==faDirectory) && (Fichier.Name != '.')&& (Fichier.Name != ".."))
          {
              ForceDirectories(rep_dest+ Fichier.Name+"\\");
              CopierFichiers(rep_source+ Fichier.Name+"\\", rep_dest+ Fichier.Name+"\\");
          }
       }
       while(FindNext(Fichier) == 0);
       FindClose(Fichier); 
    }
    }

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2002
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    permettez-moi d'ajouter une légère modification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((Fichier.Attr==faDirectory) && (Fichier.Name != '.') && (Fichier.Name != ".."))
    devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (((Fichier.Attr & faDirectory)==faDirectory) && (Fichier.Name != '.') && (Fichier.Name != ".."))
    car si un répertoire est caché, read-only ou autre, il ne serait pas copié!

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    La raison pour laquelle ta fonction ne marche pas est que les paramètres pFrom et pTo de SHFileOperation acceptent des strings avec comme separateur \0 et pour le dernier \0\0. Il te manque donc un \0 pour completer chaque parametre.
    AnsiString c'est bien, mais Windows préfère char* :)

    Donc parfois cela fonctionne parfois pas tout depends de la mémoire, voila pourquoi dans certains programmes cela fonctionne et dans d'autres pas.

    Ceci dit pas de doute, pour ce genre d'opérations c'est SHFileOperation qu'il faut utiliser et surtout pas FindFirstFile et autres ersatz.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/10/2007, 17h56
  2. [VBScript] (débutant) Copie d'un répertoire réseau
    Par benoitB dans le forum VBScript
    Réponses: 11
    Dernier message: 28/09/2005, 16h13
  3. Réponses: 5
    Dernier message: 23/06/2005, 15h46
  4. Fonction permettant de remplacer des caractères
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 06/09/2004, 15h48
  5. Fonction permettant d'afficher le chemin d'un fichier
    Par kilinette dans le forum Langage
    Réponses: 4
    Dernier message: 22/06/2004, 10h52

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