using System;
using System.IO;

namespace Addison_Wesley.Codebook.Filesystem
{
   public class FolderUtil
   {
      /// <summary>
      /// Kopůíruje adresář
      /// </summary>
      /// <param name="sourceFolderPath">cesta zdrojového adresáře</param>
      /// <param name="destFolderPath">cesta cílového adresáře</param>
      public static void CopyFolder(string sourceFolderPath, string destFolderPath)
      {
         // Objekt typu DirectoryInfo pro zdrojový adresář
         DirectoryInfo sourceFolder = new DirectoryInfo(sourceFolderPath);

         // Überprüfen, ob der Zielordner bereits existiert
         if (Directory.Exists(destFolderPath))
         {
            // Výjimka
            throw new IOException("Cílová adresář '" + destFolderPath +
               "' už existuje");
         }

         // Vytv oření cílového adresáře
         Directory.CreateDirectory(destFolderPath);

         // Zavoláme metodu pro kopírování podadresářů a souborů
         CopySubFoldersAndFiles(sourceFolder, sourceFolderPath, destFolderPath);
      }


      /// <summary>
      /// Kopíruje (rekurzivně) všechny podadresáře a soubory z daného do jiného adresáře 
      /// </summary>
      /// <param name="folder">Odkaz na objekt typu DirectoryInfo, který představuje adresář</param>
      /// <param name="sourceFolderPath">Cesta ke zdrojovému adresáři</param>
      /// <param name="destFolderPath">Cesta ke cílovému adresáři</param>
      private static void CopySubFoldersAndFiles(DirectoryInfo folder,
         string sourceFolderPath, string destFolderPath)
      {
         // Projdeme všechny podadresáře daného adresáře
         DirectoryInfo[] subFolders = folder.GetDirectories();
         for (int i = 0; i < subFolders.Length; i++)
         {
            // Zjistíme cestu k cílovému adresáři, v ní cestu ke
            // zdrojovému adresáři nahradíme cestou k cílovému adresáři
            string destSubFolderName = subFolders[i].FullName.Replace(
               sourceFolderPath, destFolderPath);

            // Vytvoření podadrsáře v cílovém adresáři
            Directory.CreateDirectory(destSubFolderName);

            // Rekurzivní volání funkce, aby vytvořila další podadresáře
            CopySubFoldersAndFiles(subFolders[i], sourceFolderPath,
               destFolderPath);
         }

         // Zjistíme soubory obsažené v adresáři 
         FileInfo[] files = folder.GetFiles();

         // Projdeme všechny soubory
         for (int i = 0; i < files.Length; i++)
         {
            // Zjištění clového souboru, v jeho jménu bude
            // cesta k cílovému adresáři nahrazena cestou 
            // ke zdrojovému adresáři
            string destFileName = files[i].FullName.Replace(
               sourceFolderPath, destFolderPath);

            // Kopírování souboru
            File.Copy(files[i].FullName, destFileName);
         }
      }
   }
}
