/// <summary>
 /// Deletes the specified directory and, if indicated, 
 /// any subdirectories and files in the directory.
 /// </summary>
 /// <param name="path">The path.</param>
 /// <param name="user">The user.</param>
 /// <param name="recursive">if set to <c>true</c> [recursive].</param>
 /// <param name="debug">if set to <c>true</c> [debug].</param>
 /// <returns></returns>
 public static FileOperationResult DeleteDirectory(string path, 
     DomainUser user, bool recursive = false, bool debug = false)
 {
     FileOperationResult result;
     // ReSharper disable once UnusedVariable
     using (
         var impersonation = new Impersonation(user.Domain, user.Name,
             user.Pwd, ImpersonationLevel.Delegation))
     {
         if (Directory.Exists(path))
         {
             try
             {
                 Directory.Delete(path, recursive);
                 result = new FileOperationResult(path,
                     FileOperation.Delete, true);
             }
             catch (Exception ex)
             {
                 Log.Error(ex);
                 result = new FileOperationResult(path,
                     FileOperation.Delete, ex);
             }
         }
         else
         {
             result = new FileOperationResult(path,
                     FileOperation.Delete, false, "Directory not Found");
         }
     }
     return result;
 }
 /// <summary>
 /// Deletes the file.
 /// </summary>
 /// <param name="file">The file.</param>
 /// <param name="user">The user.</param>
 /// <param name="debug">if set to <c>true</c> [debug].</param>
 /// <returns></returns>
 public static FileOperationResult DeleteFile(FileInfo file, 
     DomainUser user, bool debug = false)
 {
     FileOperationResult result;
     // ReSharper disable once UnusedVariable
     using (
         var impersonation = new Impersonation(user.Domain, user.Name,
             user.Pwd, ImpersonationLevel.Delegation))
     {
         try
         {
             File.Delete(file.FullName);
             result = new FileOperationResult(file.FullName,
                     FileOperation.Delete, true);
         }
         catch (Exception ex)
         {
             Log.Error(ex);
             result = new FileOperationResult(file.FullName,
                 FileOperation.Delete, ex);
         }
     }
     return result;
 }
        private static FileOperationResult MoveFile(FileInfo sourceFile, string destination, bool overwrite,
            bool debug = false)
        {
            FileOperationResult result;
            try
            {
                if (!Directory.Exists(destination))
                {
                    Directory.CreateDirectory(destination);
                    if (debug)
                    {
                        Log.Info($"cdir {destination}");
                    }
                }

                var dst = Path.Combine(destination, sourceFile.Name);

                if (File.Exists(dst) && overwrite)
                {
                    File.Delete(dst);
                }

                if (!File.Exists(dst))
                {
                    File.Move(sourceFile.FullName, dst);

                    result = new FileOperationResult(dst, FileOperation.Move, true);
                }
                else
                {
                    if (debug)
                    {
                        Log.Warning($"file already exists {dst}");
                    }
                    result = new FileOperationResult(dst, FileOperation.Move, false, "file already exists");
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                result = new FileOperationResult(sourceFile.FullName, FileOperation.Move, ex);
            }

            return result;
        }