ごみ箱を空にする

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

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

VB.NET
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
Imports System
Imports System.Runtime.InteropServices

Namespace SantaMarta.Tips.RecycleBin

    Class EmptyRecycleBin

        <DllImport("shell32.dll", CharSet:=CharSet.Auto)> _
        Friend Shared Function SHEmptyRecycleBin( _
            ByVal hWnd As IntPtr, _
            ByVal pszRootPath As String, _
            ByVal dwFlags As Integer) As Integer
        End Function

        ''' <summary>削除を確認するダイアログを表示しません。</summary>
        Friend Const SHERB_NOCONFIRMATION As Integer = &H1

        ''' <summary>進捗状況を表示するダイアログを表示しません。</summary>
        Friend Const SHERB_NOPROGRESSUI As Integer = &H2

        ''' <summary>処理が完了したときに効果音を鳴らしません。</summary>
        Friend Const SHERB_NOSOUND As Integer = &H4

        Friend Const S_OK As Integer = 0

        ''' <summary>
        ''' アプリケーションのメイン エントリ ポイントです。
        ''' </summary>
        Shared Sub Main(ByVal args() As String)

            Dim result As Integer

            result = SHEmptyRecycleBin(IntPtr.Zero, "", SHERB_NOPROGRESSUI Or SHERB_NOSOUND)

            If result = S_OK Then

                Console.WriteLine("ごみ箱を空にしました。")

            Else

                Console.WriteLine("ごみ箱を空にできませんでした。")

            End If

        End Sub

    End Class

End Namespace
C#
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
using System;
using System.Runtime.InteropServices;

namespace SantaMarta.Tips.RecycleBin
{
    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