Win32 APIのSHEmptyRecycleBin関数を用いることで、ドライブ毎のごみ箱を空にすることができる。 hWndには呼び出し元のウィンドウハンドルを指定する。 ウィンドウがない場合は、IntPtr.Zeroで問題ない。 dwFlagsには、SHERB_NOCONFIRMATION、 SHERB_NOPROGRESSUI、SHERB_NOSOUNDの値を組み合わせて指定する。 各フラグの説明はコードにある通り。  pszRootPathには、対象のドライブを指定する。 C:\を指定すると、Cドライブのみのごみ箱を空にすることができる。 ちなみに、 pszRootPathに""を指定すると全てのドライブのごみ箱を一度に空にできるが、なぜかWindows 2000では動作しない。

using System;
using System.Runtime.InteropServices;

class EmptyRecycleBin
{
    [DllImport( "shell32.dll", CharSet = CharSet.Auto )]
    internal static extern uint SHEmptyRecycleBin(
        IntPtr hWnd,
        string pszRootPath,
        uint dwFlags );

    /// <summary>削除を確認するダイアログを表示しません。</summary>
    internal const int SHERB_NOCONFIRMATION = 0x00000001;
    
    /// <summary>進捗状況を表示するダイアログを表示しません。</summary>
    internal const int SHERB_NOPROGRESSUI = 0x00000002;
    
    /// <summary>処理が完了したときに効果音を鳴らしません。</summary>
    internal const int SHERB_NOSOUND = 0x00000004;

    internal const uint S_OK = 0;

    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        uint result;
        
        result = SHEmptyRecycleBin( IntPtr.Zero, "", SHERB_NOPROGRESSUI | SHERB_NOSOUND );

        if ( result == S_OK ) 
        {
            Console.WriteLine( "ごみ箱を空にしました。" );
        }
        else
        {
            Console.WriteLine( "ごみ箱を空にできませんでした。" );
        }
    }
}
出力例
ごみ箱を空にしました。
Press any key to continue