Bonjour,

  Voici une petite méthode C# qui gère la copie de dossiers. Ce code est suffisamment documenté, je n’ajouterai donc pas plus de détails Clignement d'œil n’hésitez pas à utiliser les commentaires si vous avec des questions/remarques!

/// <summary>
/// Copie complète d'un dossier dans un autre
/// </summary>
/// <param name="sourceFolder">Source des fichiers/dossiers</param>
/// <param name="destinationFolder">Destination</param>
/// <param name="filter">Filtre pour récupérer les fichiers, par défault *.*</param>
/// <param name="overwriteDestinationFolder">Permet de supprimer le dossier destination avant la copie, si true alors le prochain paramètre est inutile. Valeur par défault : true.</param>
/// <param name="overwriteDestinationFiles">Permet d'écraser les fichiers déjà existant dans le dossier destination. Vrai (true) par défaut, utilisé uniquement si [overwriteDestinationFolder] est Faux (false).</param>
/// <remarks>Si une erreur apparait durant une des étapes de la copie (écrasement de fichier ouvert, suppression de dossier bloqué, opération avec accès refusée, ...) 
/// cette méthode renverra l'exception à l'appelant.</remarks>
private void CopyFolder(string sourceFolder, string destinationFolder, string filter = "*.*", bool overwriteDestinationFolder = true, bool overwriteDestinationFiles = true)
{
  //HACK: System.IO.Path.Combine donne des résultats étrange lorsque les dossiers commencent et/ou finissent par '\'
  sourceFolder = sourceFolder.Trim('\\');
  destinationFolder = destinationFolder.Trim('\\');
  if (overwriteDestinationFolder && System.IO.Directory.Exists(destinationFolder))
  {
    try
    {
      System.IO.Directory.Delete(destinationFolder, true);
      //La commande de suppression envoi la demande de suppression à l'OS.
      //Récréer le dossier peut déclencher une exception car il ne serait peut-être pas encore supprimé!
      while (System.IO.Directory.Exists(destinationFolder))
        System.Threading.Thread.Sleep(1);
    }catch
    {
      //impossible de supprimer le dossier, tentative de suppression du contenu
      System.IO.Directory.GetDirectories(destinationFolder).ToList().ForEach(t =>
      {
        System.IO.Directory.Delete(t, true);
        while (System.IO.Directory.Exists(t)) System.Threading.Thread.Sleep(1);
      });
      System.IO.Directory.GetFiles(destinationFolder).ToList().ForEach(t =>
      {
        System.IO.File.Delete(t);
      });
    }
  }
  if (!System.IO.Directory.Exists(destinationFolder))
    System.IO.Directory.CreateDirectory(destinationFolder);
  foreach (var fld in System.IO.Directory.GetDirectories(sourceFolder))
  {
    //HACK : GetFileName retourne la dernière partie du chemin a partir du dernier '\'. Ceci permet de récupérer le dernier "dossier" dans l'arborescence :)
    //ceci : System.IO.Path.Combine(destinationFolder, System.IO.Path.GetFileName(fld))
    //donnera le nouveau dossier destination pour les appels récursifs
    //NOTE : si l'écrasement du dossier destination est vrai, il a déjà été nettoyé précédement nous n'avons donc pas besoin de le renvoyer pour les sous-dossiers
    CopyFolder(fld, System.IO.Path.Combine(destinationFolder, System.IO.Path.GetFileName(fld)), filter, false, overwriteDestinationFiles);
  }
  foreach (var file in System.IO.Directory.GetFiles(sourceFolder, filter))
    System.IO.File.Copy(file, System.IO.Path.Combine(destinationFolder, System.IO.Path.GetFileName(file)), overwriteDestinationFiles);
}

 

  En espérant que ça puisse aider!

 

English Version : here