lunedì 23 agosto 2010

Gestiamo il cestino di Windows con VB.NET

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





Nessun commento: