Win32 APIのSHQueryRecycleBin関数を用いることで、ごみ箱にあるファイルのサイズと個数をドライブ毎に取得することができる。 LPSHQUERYRBINFOのcbSizeにはあらかじめ構造体の長さを入れておき、SHQueryRecycleBinを呼び出すとi64Size にはごみ箱にあるファイルの総容量、i64NumItemsにはごみ箱にあるファイルの個数が代入される。
pszRootPathには、対象のドライブを指定する。 C:\を指定すると、Cドライブのみのサイズ、個数が取得できる。 ちなみに、pszRootPathに""を指定すると全てのドライブ合計のファイル数・サイズが取得できるが、なぜかWindows 2000では正しく取得できない
using System;
using System.Runtime.InteropServices;
class QueryRecycleBin
{
[DllImport( "shell32.dll", CharSet = CharSet.Auto )]
internal static extern uint SHQueryRecycleBin(
string pszRootPath,
[MarshalAs( UnmanagedType.Struct )]ref LPSHQUERYRBINFO pSHQueryRBInfo );
[StructLayout( LayoutKind.Sequential, Pack = 4 )]
internal struct LPSHQUERYRBINFO
{
public uint cbSize;
public ulong i64Size;
public ulong i64NumItems;
}
internal const uint S_OK = 0;
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main(string[] args)
{
LPSHQUERYRBINFO info;
uint result;
foreach ( string drive in Environment.GetLogicalDrives() )
{
info = new LPSHQUERYRBINFO();
info.cbSize = (uint)Marshal.SizeOf( info );
result = SHQueryRecycleBin( drive, ref info );
Console.Write( "{0}ドライブ / ", drive[0] );
if ( result == S_OK )
{
Console.WriteLine( "ファイル: {0:0} 個、サイズ: {1:###,###,##0} Bytes", info.i64NumItems, info.i64Size );
}
else
{
Console.WriteLine( "取得できませんでした。" );
}
}
}
}
Imports System
Imports System.Runtime.InteropServices
Class QueryRecycleBin
<DllImport("shell32.dll", CharSet:=CharSet.Auto)> _
Friend Shared Function SHQueryRecycleBin( _
ByVal pszRootPath As String, _
<MarshalAs(UnmanagedType.Struct)> ByRef pSHQueryRBInfo As LPSHQUERYRBINFO) _
As Integer
End Function
<StructLayout(LayoutKind.Sequential, Pack:=4)> _
Friend Structure LPSHQUERYRBINFO
Public cbSize As Integer
Public i64Size As Long
Public i64NumItems As Long
End Structure
Friend Const S_OK As Integer = 0
''' <summary>
''' アプリケーションのメイン エントリ ポイントです。
''' </summary>
Shared Sub Main(ByVal args As String())
Dim info As LPSHQUERYRBINFO
Dim result As Integer
For Each drive As String In Environment.GetLogicalDrives()
info = New LPSHQUERYRBINFO
info.cbSize = Marshal.SizeOf(info)
result = SHQueryRecycleBin(drive, info)
Console.Write("{0}ドライブ / ", drive.Chars(0))
If result = S_OK Then
Console.WriteLine("ファイル: {0:0} 個、サイズ: {1:###,###,##0} Bytes", info.i64NumItems, info.i64Size)
Else
Console.WriteLine("取得できませんでした。")
End If
Next
End Sub
End Class
出力例
Aドライブ / ファイル: 0 個、サイズ: 0 Bytes Cドライブ / ファイル: 1 個、サイズ: 137 Bytes Dドライブ / ファイル: 2 個、サイズ: 2,279 Bytes Eドライブ / ファイル: 1 個、サイズ: 138 Bytes Fドライブ / ファイル: 0 個、サイズ: 0 Bytes Gドライブ / ファイル: 0 個、サイズ: 0 Bytes Hドライブ / ファイル: 0 個、サイズ: 0 Bytes Iドライブ / ファイル: 0 個、サイズ: 0 Bytes Jドライブ / ファイル: 0 個、サイズ: 0 Bytes Press any key to continue