using System;
using System.Runtime.InteropServices;

namespace Addison_Wesley.Codebook.Filesystem
{
   public class FileUtil
   {
       /* Deklarace nezbytných funkcí, struktur a konstant z API */
      [DllImport("shell32.dll", CharSet = CharSet.Auto)]
      static extern int SHFileOperation(ref SHFILEOPSTRUCT fileOp);

      private const int FO_DELETE = 0x0003;          // Smazání souboru/adresáře
      private const int FOF_ALLOWUNDO = 0x0040;     // Umožní undo
      private const int FOF_NOCONFIRMATION = 0x0010; // Bez dotazu

      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
      public struct SHFILEOPSTRUCT
      {
         public IntPtr hwnd;
         public int wFunc;
         public string pFrom;
         public string pTo;
         public short fFlags;
         [MarshalAs(UnmanagedType.Bool)]
         public bool fAnyOperationsAborted;
         public IntPtr hNameMappings;
         public string lpszProgressTitle;
      }

      /// <summary>
      /// Přesune soubor do koše
      /// </summary>
      /// <param name="path">Cesta k souboru</param>
      /// <returns>Vrátí true, byl-li přesun úspěšný</returns>
      public static bool MoveToRecycleBin(string path)
      {
          // Vytvoření struktury pro informace o souboru 
         SHFILEOPSTRUCT fileOp = new SHFILEOPSTRUCT();

         // Definice zdroje. Více zadaných souborů nebo
         // složek se musí oddělit pomocí znaků 0.
         // Na konci musí být další znak 0 
         fileOp.pFrom = path + "\x0\x0";

         // Nastavení příznaků tak, aby byl proces vratný a aby 
         // se nepožadovalo potvrzení od uživatele 
         fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;

         // Definování (pod)funkce
         fileOp.wFunc = FO_DELETE;

         // Volání funkce ShFileOperation s předanou strukturou 
         int result = SHFileOperation(ref fileOp);

         // Vrácená hodnota: úspěch nebo chyba. Funkce SHFileOperation
         // vrátí 0, jestliže nedošlo k žádné chybě 
         return (result == 0);
      }
   }
}
