In questo post vorrei proporvi una classe che, grazie all’utilizzo di P/Invoke, permette di gestire il cestino di Windows.
La classe è una classe statica (un Helper) che dispone di due metodi:
- Empty() : permette di svuotare il cestino (con la possibilità di scegliere alcune opzioni quali la richiesta di conferma, il sonoro e la finestra di progress della cancellazione);
- GetSize() : permette di ricavare il numero di elementi presenti nel cestino e la loro dimensione.
La classe è la seguente:
Imports System.Runtime.InteropServices
Public Class RecycleBinHelper
Private Const S_OK = 0
Private Const S_Empty = -2147418113
<DllImport("shell32.dll")>
Private Shared Function SHEmptyRecycleBin(ByVal hWnd As IntPtr, ByVal pszRootPath As String, ByVal dwFlags As UInt32) As Integer
End Function
<DllImport("shell32.dll")>
Private Shared Function SHQueryRecycleBin(ByVal pszRootPath As String, ByRef pSHQueryRBInfo As SHQUERYRBINFO) As Integer
End Function
Public Shared Function GetSize(ByRef numItems As Integer, ByRef totalSize As Int64) As Boolean
Dim retval = False
Dim shrb = New SHQUERYRBINFO()
shrb.cbSize = Marshal.SizeOf(GetType(SHQUERYRBINFO))
If SHQueryRecycleBin(String.Empty, shrb) = S_OK Then
totalSize = shrb.i64Size
numItems = CInt(shrb.i64NumItems)
retval = True
End If
Return retval
End Function
Public Shared Function Empty(Optional ByVal flags As RecycleBinOptions = 0) As Boolean
Dim retval = True
Dim hresult = SHEmptyRecycleBin(IntPtr.Zero, String.Empty, CUInt(flags))
If hresult <> S_OK And hresult <> S_Empty Then
retval = False
End If
Return retval
End Function
<StructLayout(LayoutKind.Sequential, Pack:=4)>
Private Structure SHQUERYRBINFO
Public cbSize As Int32
Public i64Size As Long
Public i64NumItems As Long
End Structure
End Class
<Flags()>
Public Enum RecycleBinOptions
NoConfirmation = 1
NoProgressUI = 2
NoSound = 4
End Enum
Per eseguire le operazioni sul cestino vengono utilizzate le due API SHEmptyRecycleBin (info) e SHQueryRecycleBin (info) presenti nella dll shell32.dll.
Un esempio di utilizzo della classe è il seguente:
Sub Main()
Dim size As Int64
Dim numItems As Int32
If RecycleBinHelper.GetSize(numItems, size) Then
Console.WriteLine(String.Format("Sono presenti {0} elementi per un totale di {1} bytes",
numItems, size))
End If
If RecycleBinHelper.Empty(RecycleBinOptions.NoConfirmation) Then
Console.WriteLine("Cestino svuotato!!!")
End If
Console.ReadLine()
End Sub
Technorati Tags: SHEmptyRecycleBin,SHQueryRecycleBin,SHQUERYRBINFO,P/Invoke,shell32.dll,recycle bin,cestino
Commenti