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

API, COM et SDKs Delphi Discussion :

Meilleur code pour copier un dossier


Sujet :

API, COM et SDKs Delphi

  1. #1
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2002
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 258
    Points : 609
    Points
    609
    Par défaut Meilleur code pour copier un dossier
    Bonjour,
    Selon vous, quel est le meilleur code pour copier le contenu d'un dossier vers un autre ?
    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
     
    // Copie un dossier
    function CopierDossier(Source, Destination: String;
      Erreur: Boolean = True; LectureSeul: Boolean = True;
      Ecraser: Boolean = True): Boolean;
    var
      FichierRech: TSearchRec;
      Attributes, NewAttributes: Word;
    begin
      // Vérifie que les chaines finissent bien par un slash
      Source      := IncludeTrailingPathDelimiter(Source);
      Destination := IncludeTrailingPathDelimiter(Destination);
      Result      := True;
     
      // Recherche le premier fichier
      if SysUtils.FindFirst(Source + '*.*', faAnyFile, FichierRech) = 0 then
      begin
        repeat
          // Si il s'agit d'un fichier
          if (FichierRech.Attr and faDirectory) = 0 then
          begin
            // Vérifie si le fichier n'existe pas déjà
            if not Ecraser then
              if FileExists(Destination + FichierRech.Name) then
                Continue;
     
            // Copie le fichier
            if not CopyFile(PChar(Source + FichierRech.Name),
              PChar(Destination + FichierRech.Name), False) then
            begin
              // Si l'affichage des erreurs est demandé
              if Erreur then
              begin
                MessageDlg('Erreur d''E/S'#13#10#13#10
                  + 'Erreur lors de la copie d''un fichier'#13#10#13#10
                  + 'Le fichier :'#13#10
                  + QuotedStr(Source + FichierRech.Name) + #13#10
                  + ' n''a pas pu être copié dans le dossier :'#13#10
                  + QuotedStr(Destination), mtWarning, 0);
              end;
              Result := False;
              Exit;
            end;
          end
          // Si il s'agit d'un dossier
          else
            // Si il ne s'agit pas du dossier racine
            if (FichierRech.Name <> '.') and (FichierRech.Name <> '..') then
            begin
              // Créer le dossier
              if not(SysUtils.ForceDirectories(Destination + FichierRech.Name)) then
              begin
                if Erreur then
                begin
                  MessageDlg('Erreur d''E/S'#13#10#13#10
                    + 'Erreur lors de la création d''un dossier'#13#10#13#10
                    + 'Le dossier ' + QuotedStr(Destination + FichierRech.Name)
                    + ' n''a pas pu être crée.', mtWarning, 0);
                end;
                Result := False;
                Exit;
              end;
     
              CopierDossier(Source + FichierRech.Name, Destination + FichierRech.Name);
            end;
     
            // Si on doit enlever les lectures seul
            if not(LectureSeul) then
            begin
              Attributes := FileGetAttr(Destination + FichierRech.Name);
     
              // Si le fichier est en lecture seul
              if (Attributes and SysUtils.faReadOnly) = faReadOnly then
              begin
                // Retire la lecture seul
                NewAttributes := Attributes;
                NewAttributes := NewAttributes and not SysUtils.faReadOnly;
                FileSetAttr(Destination + FichierRech.Name, NewAttributes);
              end;
            end;
     
          // Évite le plantage sous Windows Vista
          Application.ProcessMessages;
        until SysUtils.FindNext(FichierRech) <> 0;
        // Arrête la recherche
        SysUtils.FindClose(FichierRech);
      end;
    end;
    ou
    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
     
    // Copie un dossier
    function CopierDossier(Source, Destination: String;
      Erreur: Boolean = True; LectureSeul: Boolean = True;
      Ecraser: Boolean = True): Boolean;
    var
      fos: TSHFileOpStruct;
    begin
      // Vérifie que les chaines ne finissent pas par un slash
      Source      := IncludeTrailingPathDelimiter(Source) + '*';
      Destination := ExcludeTrailingPathDelimiter(Destination);
     
      ZeroMemory(@fos, SizeOf(fos));
      with fos do
      begin
        wFunc   := FO_COPY;
        pFrom   := PChar(Source + #0);
        pTo     := PChar(Destination + #0);
        if Erreur then
          fFlags  := FOF_SILENT or FOF_NOCONFIRMMKDIR
        else
          fFlags  := FOF_SILENT or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI;
     
        if Ecraser then
          fFlags  := fFlags or FOF_NOCONFIRMATION;
      end;
      Result := (0 = ShFileOperation(fos));
    end;
    Merci et bonne journée

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Le deuxième est (théoriquement) plus efficace, car assuré par l'OS lui-même.

    Toutefois, il n'est pas "contrôlable", tu ne peux notamment pas mettre la copie en pause et/ou continuer après une erreur, même l'interruption de la copie peut être un peu gênante parfois.

    Le premier, est plus finement contrôlable, et peut parfois être plus rapide (au détriment bien sûr du reste de la machine !!) en augmentant la priorité du thread qui l'exécute.

    Reste à savoir si le contrôle de la copie est crucial pour toi (contrôle d'exécution et complétude de la copie)...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Code pour compresser un dossier
    Par Tchaill39 dans le forum Langage
    Réponses: 1
    Dernier message: 06/06/2008, 16h43
  2. Réponses: 12
    Dernier message: 24/09/2007, 14h35
  3. Code pour verouiller un dossier sous Windows XP
    Par PHIL45 dans le forum Delphi
    Réponses: 2
    Dernier message: 26/12/2006, 13h01
  4. Réponses: 3
    Dernier message: 20/11/2006, 17h48
  5. Réponses: 2
    Dernier message: 18/11/2005, 16h29

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