public static void ShellDelete(string FullPath, RecycleOption recycle, UICancelOption OnUserCancel, FileOrDirectory FileOrDirectory)
        {
            ShFileOperationFlags operationFlags = ShFileOperationFlags.FOF_SILENT | ShFileOperationFlags.FOF_NOCONFIRMATION;

            if (recycle == RecycleOption.SendToRecycleBin)
            {
                operationFlags |= ShFileOperationFlags.FOF_ALLOWUNDO;
            }
            ShellFileOperation(SHFileOperationType.FO_DELETE, operationFlags, FullPath, null, OnUserCancel, FileOrDirectory);
        }
        public static void ShellFileOperation(SHFileOperationType OperationType, ShFileOperationFlags OperationFlags, string FullSource, string FullTarget, UICancelOption OnUserCancel, FileOrDirectory FileOrDirectory)
        {
            int num;

            new UIPermission(UIPermissionWindow.SafeSubWindows).Demand();
            FileIOPermissionAccess noAccess = FileIOPermissionAccess.NoAccess;

            if (OperationType == SHFileOperationType.FO_COPY)
            {
                noAccess = FileIOPermissionAccess.Read;
            }
            else if (OperationType == SHFileOperationType.FO_MOVE)
            {
                noAccess = FileIOPermissionAccess.Write | FileIOPermissionAccess.Read;
            }
            else if (OperationType == SHFileOperationType.FO_DELETE)
            {
                noAccess = FileIOPermissionAccess.Write;
            }
            string fullDirectoryPath = FullSource;

            if (((OperationType == SHFileOperationType.FO_COPY) || (OperationType == SHFileOperationType.FO_MOVE)) && fullDirectoryPath.EndsWith("*", StringComparison.Ordinal))
            {
                fullDirectoryPath = RemoveEndingSeparator(FullSource.TrimEnd(new char[] { '*' }));
            }
            if (FileOrDirectory == FileOrDirectory.Directory)
            {
                DemandDirectoryPermission(fullDirectoryPath, noAccess);
            }
            else
            {
                new FileIOPermission(noAccess, fullDirectoryPath).Demand();
            }
            if (OperationType != SHFileOperationType.FO_DELETE)
            {
                if (FileOrDirectory == FileOrDirectory.Directory)
                {
                    DemandDirectoryPermission(FullTarget, FileIOPermissionAccess.Write);
                }
                else
                {
                    new FileIOPermission(FileIOPermissionAccess.Write, FullTarget).Demand();
                }
            }
            SHFILEOPSTRUCT lpFileOp = GetShellOperationInfo(OperationType, OperationFlags, FullSource, FullTarget);

            new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
            try
            {
                num = SHFileOperation(ref lpFileOp);
                SHChangeNotify(145439, 3, IntPtr.Zero, IntPtr.Zero);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                CodeAccessPermission.RevertAssert();
            }
            if (lpFileOp.fAnyOperationsAborted)
            {
                if (OnUserCancel == UICancelOption.ThrowException)
                {
                    throw new OperationCanceledException();
                }
            }
            else if (num != 0)
            {
                ThrowWinIOError(num);
            }
        }
        private static SHFILEOPSTRUCT GetShellOperationInfo(SHFileOperationType OperationType, ShFileOperationFlags OperationFlags, string[] SourcePaths, [Optional, DefaultParameterValue(null)] string TargetPath)
        {
            SHFILEOPSTRUCT shfileopstruct2 = new SHFILEOPSTRUCT();

            shfileopstruct2.wFunc  = (uint)OperationType;
            shfileopstruct2.fFlags = (ushort)OperationFlags;
            shfileopstruct2.pFrom  = GetShellPath(SourcePaths);
            if (TargetPath == null)
            {
                shfileopstruct2.pTo = null;
            }
            else
            {
                shfileopstruct2.pTo = GetShellPath(TargetPath);
            }
            shfileopstruct2.hNameMappings = IntPtr.Zero;
            try
            {
                shfileopstruct2.hwnd = Process.GetCurrentProcess().MainWindowHandle;
            }
            catch (Exception exception)
            {
                if ((!(exception is SecurityException) && !(exception is InvalidOperationException)) && !(exception is NotSupportedException))
                {
                    throw;
                }
                shfileopstruct2.hwnd = IntPtr.Zero;
            }
            shfileopstruct2.lpszProgressTitle = string.Empty;
            return(shfileopstruct2);
        }
 private static SHFILEOPSTRUCT GetShellOperationInfo(SHFileOperationType OperationType, ShFileOperationFlags OperationFlags, string SourcePath, [Optional, DefaultParameterValue(null)] string TargetPath)
 {
     return(GetShellOperationInfo(OperationType, OperationFlags, new string[] { SourcePath }, TargetPath));
 }