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

Langage Delphi Discussion :

Copier un répertoire [FAQ]


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut Copier un répertoire
    Bonjour à tous,

    Dans la FAQ, il est expliqué comment on déplace un répertoire sous Windows.
    Mais, comment fait-on pour copier un répertoire d'un CD vers un HDD, par exemple ?

    Peut-on passer par un CopyFile générique, du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CopyFile('d:\MonRépertoire\*.*','c:\MonRépertoire\*.*', EchecSiExiste)  ?
    Merci de vos réponses.

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Dans le sens CD -> HDD je ne vois pas pourquoi ça ne fonctionnerait pas... As-tu essayé ?

    Dans l'autre sens par contre il faut savoir graver un CD... Et ça j'ai aucune idée de comment on fait

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sjrd
    Dans l'autre sens par contre il faut savoir graver un CD... Et ça j'ai aucune idée de comment on fait
    Sous XP voir CD IMAPI :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/interacting_with_imapi.asp

    Article en Allemand
    http://www.entwickler.com/itr/online_artikel/psecom,id,631,nodeid,56.html#
    Source :
    http://www.uaconsulting.de/de/downloads/downloads.htm

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Merci !

    Je n'ai pas à copier du HDD vers le CD, ça m'évitera de réviser mon allemand !

    A part ça, la copie générique ne fonctionne pas... Je vais me débrouiller autrement.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Vulcanos
    Je n'ai pas à copier du HDD vers le CD
    Je l'ai indiqué au cas où.
    Citation Envoyé par Vulcanos
    A part ça, la copie générique ne fonctionne pas... Je vais me débrouiller autrement.
    Dans la faq regarde le lien MSDN, dans cette exemple de code, les flags de SHFILEOPSTRUCT ne sont peut être pas tous approprié pour une copie *.*.

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Effectivement, la doc Microsoft précise :

    typedef struct _SHFILEOPSTRUCT {
    HWND hwnd;
    UINT wFunc;
    LPCTSTR pFrom;
    LPCTSTR pTo;
    FILEOP_FLAGS fFlags;
    BOOL fAnyOperationsAborted;
    LPVOID hNameMappings;
    LPCTSTR lpszProgressTitle;
    } SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

    pFrom
    [..]These names must be fully qualified paths. Standard Microsoft MS-DOS wild cards, such as "*", are permitted in the file-name position [..]

    fFlags
    Flags that control the file operation. This member can take a combination of the following flags.
    [..]
    FOF_FILESONLY
    Perform the operation on files only if a wildcard file name (*.*) is specified.

    FOF_NORECURSION
    Only operate in the local directory. Don't operate recursively into subdirectories.
    [..]
    Je n'ai pas testé. Avant de recevoir ta réponse, j'avais contourné le problème en appelant, depuis mon programme, un script .BAT contenant une série de XCOPY.

    Il n'empêche... Je découvre la puissance de cette fonction ShFileOperation.

    Merci du coup de main.

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    En retour peux-tu nous communiquer ton code afin de complèter la FAQ ?

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Pas de problème, mais est-ce que ça vaut le coup ?

    Code Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ShellExecute(Application.Handle,
                   'open',
                   PChar(GetEnvironmentVariable('ComSpec')),
                   '/C MonScript.bat',
                   'c:\',
                   SW_SHOW);
    Le script MONSCRIPT.BAT est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    rem---------------------------------------------------------
    MD c:\Repertoire01
    MD c:\Repertoire02
    rem---------------------------------------------------------
    XCopy d:\Repertoire01\*.* c:\Repertoire01\*.* /S
    XCopy d:\Repertoire02\*.* c:\Repertoire02\*.* /S
    rem---------------------------------------------------------
    Avec :
    c:\ --> HDD
    d:\ --> Lecteur de CD

    Remarque : les 2 premières lignes (création des répertoires) sont peut-être inutiles. Il me semble que XCopy est capable de les créer, mais je ne suis pas sûr.

    Si tu attends un peu, je t'envoie les résultats avec la fonction ShFileOperation

    A+

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par Vulcanos
    Pas de problème, mais est-ce que ça vaut le coup ?
    Au vu de ta demande initiale, son existence t'aurait bien aidé, n'est-il pas ?
    Citation Envoyé par Vulcanos
    Si tu attends un peu,
    C'est ce qui caractérise l'équipe de la FAQ.

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Au vu de ta demande initiale, son existence t'aurait bien aidé, n'est-il pas ?
    Certes...

    Bon, je rencontre un problème en voulant tester la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var
      fos : SHFILEOPSTRUCT;
    Là, je me récupère : "identificateur SHFILEOPSTRUCT non déclaré".
    Idem pour tous les paramètres de la structure et pour la fonction elle-même, bien sûr.

    Je ne pige pas... Et j'ai bien :

  11. #11
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    SHFILEOPSTRUCT n'est pas déclaré dans l'unité Windows mais dans l'unité ShellAPI

  12. #12
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Voici une solution (utilisant SHFILEOPSTRUCT):
    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
     
    procedure CopyFolder(FromFld, ToFld: string);
    var fos: TSHFileopStruct; frm, dst: PChar;
    begin
      FillChar(fos, SizeOf(fos), 0);
      FromFld := Trim(FromFld);
      ToFld := Trim(ToFld);
      // il faut supprimer les antislashs de fin sinon tu auras droit a un beau message d'erreur
      if FromFld[Length(FromFld)] = '\' then
        FromFld := Copy(FromFld, 1, Length(FromFld) - 1);
     
      if ToFld[Length(ToFld)] = '\' then
        ToFld := Copy(ToFld, 1, Length(ToFld) - 1);
     
      frm := StrAlloc(Length(FromFld) + 1);
      dst := StrAlloc(Length(ToFld) + 1);
      frm := PChar(FromFld);
      dst := PChar(ToFld);
     
      // Ajout du Null de fin de chaine
      frm[Length(FromFld) + 1] := #0;
      dst[Length(ToFld) + 1] := #0;
     
      fos.Wnd := Application.MainForm.Handle;
      fos.wFunc := FO_COPY;
      fos.pFrom := frm;
      fos.pTo := dst;
      fos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
      fos.fAnyOperationsAborted := False;
      if (SHfileoperation(fos) = 0) then
        ShowMessage('Copie effectuée avec succès')
      else
        ShowMessage('Copie non effectuée');
    end;
    Voici comment tu l'utilises:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyFolder('d:\Repertoire01', 'c:\Repertoire01');

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Merci à Pedro pour le ShellApi

    Merci à Delphichem pour ton code, quoique la ligne suivante puisse réserver quelques désagréements.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fos.Wnd := Application.MainForm.Handle;
    Donc, le boulot étant maché, ça donne :

    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
     
    function TForm4.CopyFolder(FromFld, ToFld: string): boolean;
    var fos: TSHFileopStruct; frm, dst: PChar;
    begin
      FillChar(fos, SizeOf(fos), 0);
      FromFld := Trim(FromFld);
      ToFld := Trim(ToFld);
    // il faut supprimer les antislashs de fin sinon tu auras droit a un beau message d'erreur
      if FromFld[Length(FromFld)] = '\' then
        FromFld := Copy(FromFld, 1, Length(FromFld) - 1);
     
      if ToFld[Length(ToFld)] = '\' then
        ToFld := Copy(ToFld, 1, Length(ToFld) - 1);
     
      frm := StrAlloc(Length(FromFld) + 1);
      dst := StrAlloc(Length(ToFld) + 1);
      frm := PChar(FromFld);
      dst := PChar(ToFld);
     
      FillChar(fos, SizeOf(fos),0);
      with fos do
      begin
        wFunc := FO_COPY;
        pFrom := PChar(frm+#0);
        pTo   := PChar(dst+#0);
        fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
      end;
      if ShFileOperation(fos)=0 then Result := True else Result := false;
    end;
    Appel à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if CopyFolder('d:\Repertoire01', 'c:\Repertoire02')then
         ShowMessage('Copie effectuée avec succés') else
         ShowMessage('Copie non effectuée');
    A+

  14. #14
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Un peu plus optimal (en mixant les solutions):
    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
    function CopyFolder(FromFld, ToFld: string): boolean;
    var fos: TSHFileopStruct;
    begin
      FromFld := Trim(FromFld);
      ToFld := Trim(ToFld);
    // il faut supprimer les antislashs de fin sinon tu auras droit a un beau message d'erreur
      if FromFld[Length(FromFld)] = '\' then
        FromFld := Copy(FromFld, 1, Length(FromFld) - 1);
     
      if ToFld[Length(ToFld)] = '\' then
        ToFld := Copy(ToFld, 1, Length(ToFld) - 1);
     
      FillChar(fos, SizeOf(fos),0);
      with fos do
      begin
        wFunc := FO_COPY;
        pFrom := PChar(FromFld+#0);
        pTo   := PChar(ToFld+#0);
        fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
      end;
      Result := ShFileOperation(fos)=0;
    end;

  15. #15
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    je sais que c'est déjà résolu mais je veux savoir si on peut remplasser
    ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if FromFld[Length(FromFld)] = '\' then 
        FromFld := Copy(FromFld, 1, Length(FromFld) - 1);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if FromFld[Length(FromFld)] = '\' then setlength(FromFld,length(FromFld)-1);

  16. #16
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Oui sans aucun problème, mais cela n'affecte pas les performance.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/05/2007, 14h33
  2. Comment copier un répertoire et ses fichiers?
    Par Mickey.jet dans le forum Delphi
    Réponses: 4
    Dernier message: 08/07/2006, 13h35
  3. Réponses: 2
    Dernier message: 21/05/2006, 18h26
  4. [VB6] Copier un répertoire
    Par Sytchev3 dans le forum VB 6 et antérieur
    Réponses: 20
    Dernier message: 07/04/2006, 17h12
  5. Comment copier un répertoire et son contenu ?
    Par yoghisan dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 20/06/2004, 18h40

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