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 :

SHFileOperation et copie multiple


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut SHFileOperation et copie multiple
    Bonjour.

    J'utilise la méthode SHFileOperation(), afin de copier des fichiers d'une partition A vers une partition B. Quand il s'agit de copier un dossier spécifique, par exemple "C:\DEV", tout va bien. Quand il s'agit de copier des fichiers particuliers, du type "C:\*.txt" ou même "C:\*.txt", tout fonctionne.

    Le soucis, c'est que je souhaiterais copier tout le contenu d'un disque. C'est à dire tout le C:\ par exemple. Après de multiples essais, je n'arrive pas a copier tout depuis la racine d'un disque.

    Je me suis donc orienter vars un listing de tous les dossiers présents à la racine, puis une copie multiple à l'aide de SHFileOperation() toujours.

    Malheureusement, je rencontre quelques difficultés concernant la copie dite multiple. Voila ce que dit la doc MSDN concernant ce point :

    Each file name is terminated by a single NULL character. The last file name is terminated with a double NULL character ("\0\0") to indicate the end of the buffer.
    Donc, si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string source = "C:\\*\0\0"
    Ca va me copier la totalité des fichiers de C:\. Par contre, si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string source = "C:\\*\0C:\\DEV\0\0"
    ,et bien ca ne me copie, encore, que les fichiers de C:\, et ca ne prend pas en compte le répertoire DEV.

    Qu'est ce qui pose problème ?

    Cordialement,
    PKO

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Essaie plutôt ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    string source("C:\\*\0C:\\DEV\0\0", 13);
    Et encore, il est possible que ceci suffise:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    string source("C:\\*\0C:\\DEV\0", 12);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Bonjour Médinoc, et merci.

    Malheureusement, rien n'y fait, ça me copie bien les fichiers, mais pas le repertoire \DEV. Je poste mon code, peut être que l'erreur est ailleurs :

    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
    void CopyData()
    {
    	string src = "P:\\*\0P:\\DEV\0\0";
    	string dst = "C:\\TEST\0\0"
    
    //	string source("P:\\*\0P:\\DEV\0", 12); // Résultat identique
    
    
    
    
    
    	// Configuration de la copie
    	SHFILEOPSTRUCTA fop2;
    	fop2.hwnd=NULL;
    	fop2.wFunc=FO_COPY;
    	fop2.pFrom=src.c_str();					
    	fop2.pTo=dst.c_str();					
    	fop2.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_SIMPLEPROGRESS;
    	fop2.fAnyOperationsAborted = 0;
    	fop2.hNameMappings = NULL;
    	fop2.lpszProgressTitle = "Test"
    
    	// Lancement de la copie
    	SHFileOperationA(&fop2);
    }
    J'ai mis en gras les éléments que qui peuvent être des détails important.

    Pour information, je suis sous Windows XP, et je boss avec API Windows et Qt. Je suis preneur de toutes informations utiles.

    Cordialement,
    PKO

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne vois pas ma correction dans ce code. Sache que sans, c'est sûr de ne pas marcher, car le constructeur std::string::string(char*) s'arrête au premier caractère nul. Tu dois utiliser un constructeur de string qui prend la vraie longueur en paramètre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Oui, ta modification n'apparait pas dans le code. J'ai mis ma première version. J'ai bel et bien testé ce que tu as expliqué dans ton précédent poste, hélas, le résultat reste le même : Le programme copie bien les fichiers, mais pas le repertoire.

    Étant donné que le code posté me fourni le même résultat avec, ou sans la modification, je n'ai pas jugé utile de le faire apparaitre (loin de moi l'idée que ta remarque est inutile bien sur !)

    Cordialement,
    PKO

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    As-tu un retour d'erreur de la fonction ?

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

Discussions similaires

  1. Copie Multiples en Lisp pour AutoCad
    Par grekenski108 dans le forum Lisp
    Réponses: 0
    Dernier message: 14/09/2012, 01h40
  2. Réponses: 8
    Dernier message: 26/09/2011, 14h44
  3. [XL-2003] Copie multiple d'une cellule
    Par demongin dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 24/06/2010, 13h55
  4. Copies multiples de données d'une base SQL à une autre
    Par leymiris dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/11/2008, 16h46
  5. Probleme de copie multiple
    Par blondelle dans le forum C++Builder
    Réponses: 12
    Dernier message: 11/09/2006, 16h50

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