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( "取得できませんでした。" );
            }
        }
    }
}
出力例
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