SHFileOperation

C# Signature:

[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true, ThrowOnUnmappableChar = true)]
static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);

VB.NET Signature:

<DllImport("shell32.dll", CharSet:=CharSet.Auto, SetLastError:=true, ThrowOnUnmappableChar:=true)> _
Public Function SHFileOperation(<MarshalAs(UnmanagedType.Struct)>ByRef lpFileOp As SHFILEOPSTRUCT) As Integer
End function

VB Signature

Public Declare Function SHFileOperation Lib "shell32" Alias "SHFileOperationA" _
        (lpFileOp As SHFILEOPSTRUCT) As Long

Tips & Tricks:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)]
public struct SHFILEOPSTRUCT32
{
   public IntPtr hwnd;
   public uint wFunc;
   [MarshalAs(UnmanagedType.LPTStr)]
   public string pFrom;
   [MarshalAs(UnmanagedType.LPTStr)]
   public string pTo;
   public ushort fFlags;
   public bool fAnyOperationsAborted;
   public IntPtr hNameMappings;
   [MarshalAs(UnmanagedType.LPTStr)]
   public string lpszProgressTitle;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SHFILEOPSTRUCT64
{
   public IntPtr hwnd;
   public uint wFunc;
   [MarshalAs(UnmanagedType.LPTStr)]
   public string pFrom;
   [MarshalAs(UnmanagedType.LPTStr)]
   public string pTo;
   public ushort fFlags;
   public bool fAnyOperationsAborted;
   public IntPtr hNameMappings;
   [MarshalAs(UnmanagedType.LPTStr)]
   public string lpszProgressTitle;
}

[DllImport("shell32.dll", EntryPoint = "SHFileOperation", CharSet = CharSet.Auto, SetLastError = true, ThrowOnUnmappableChar = true)]
static extern int SHFileOperation32(ref SHFILEOPSTRUCT32 lpFileOp);

[DllImport("shell32.dll", EntryPoint = "SHFileOperation", CharSet = CharSet.Auto, SetLastError = true, ThrowOnUnmappableChar = true)]
static extern int SHFileOperation64(ref SHFILEOPSTRUCT64 lpFileOp);

public unsafe void SendToRecycleBin(string path, bool silent = true)
{
   var flags = FILEOP_FLAGS.FOF_ALLOWUNDO;
   if (silent) { flags |= FILEOP_FLAGS.FOF_SILENT | FILEOP_FLAGS.FOF_NOCONFIRMATION; }

   if (sizeof(IntPtr) == 4)
   {
     var data = new SHFILEOPSTRUCT32
     {
       wFunc = (uint)FileFuncFlags.FO_DELETE,
       pFrom = path + '\0',
       fFlags = (ushort)flags
     };
     SHFileOperation32(ref data);
   }
   else
   {
     var data = new SHFILEOPSTRUCT64
     {
       wFunc = (uint)FileFuncFlags.FO_DELETE,
       pFrom = path + '\0',
       fFlags = (ushort)flags
     };
     SHFileOperation64(ref data);
   }
}

Alternative Managed API:

Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile(string, Microsoft.VisualBasic.FileIO.UIOption, Microsoft.VisualBasic.FileIO.RecycleOption);

Última actualización