最終更新日 2006 年 7 月 20 日
サンプル コードのダウンロード (vbmigtips_SHFileOperation.msi, 489 KB)
※ このサンプルをインストールするには Visual Studio 2005 が必要です。
ファイルを完全に削除するのではなく、ゴミ箱に移動させたい場合があると思います。そこで今回、ファイルをゴミ箱に移動させる方法について紹介します。
ファイルをゴミ箱に移動させる場合、Win32 API の SHFileOperation 関数を使用します。実装方法は以下のとおりです。今回は、図1 の「ファイルを削除」ボタンをクリックすると、ダイアログが表示され、削除するファイルを選択後、「開く」ボタンをクリックすると選択したファイルがゴミ箱に移動されるアプリケーションを作成します。]
図
1
まず、ファイルをゴミ箱に移動させる SHFileOperation 関数の定義の宣言と、ファイル操作に関する情報を格納する SHFILEOPSTRUCT 構造体の宣言を行います。
Friend Class NativeMethods
<DllImport("shell32.dll", CharSet:=CharSet.Unicode)> _
Friend Shared Function SHFileOperation(ByRef lpFileOp As SHFILEOPSTRUCT) As Integer
End Function
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, Pack:=1)> _
Structure SHFILEOPSTRUCT
Friend hwnd As IntPtr
Friend wFunc As Integer
<MarshalAs(UnmanagedType.LPWStr)> Friend pFrom As String
<MarshalAs(UnmanagedType.LPWStr)> Friend pTo As String
Friend fFlags As Short
Friend fAnyOperationsAborted As Integer
Friend hNameMappings As IntPtr
<MarshalAs(UnmanagedType.LPWStr)> Friend lpszProgressTitle As String
End Structure
Friend Const FO_COPY = &H2
Friend Const FO_DELETE = &H3
Friend Const FO_MOVE = &H1
Friend Const FOF_ALLOWUNDO = &H40
Private Sub New()
End Sub
End Class |
リスト1
次に、リスト1 で定義の宣言を行った SHFileOperation 関数を呼び出し、指定したファイルをゴミ箱に移動させます。今回は、ゴミ箱に移動させるファイルをダイアログから選択します。実装コードは以下のとおりです。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strDeletionFile As String
OpenFileDialog1.Multiselect = True
OpenFileDialog1.Filter = "すべてのファイル (*.*)|*.*"
OpenFileDialog1.FileName = ""
OpenFileDialog1.Title = "削除するファイルを選択してください"
If Windows.Forms.DialogResult.OK = Me.OpenFileDialog1.ShowDialog() Then
For Each fileName As String In OpenFileDialog1.FileNames
strDeletionFile = strDeletionFile + fileName + ControlChars.NullChar
Next
Dim sh As NativeMethods.SHFILEOPSTRUCT
Dim result As Integer
Try
With sh
.hwnd = IntPtr.Zero
.wFunc = NativeMethods.FO_DELETE
.pFrom = strDeletionFile
.pTo = Nothing
.fFlags = NativeMethods.FOF_ALLOWUNDO
.fAnyOperationsAborted = False
.hNameMappings = IntPtr.Zero
.lpszProgressTitle = Nothing
End With
result = NativeMethods.SHFileOperation(sh)
Catch ex As Exception
MessageBox.Show("ファイルを削除できません。")
Throw
End Try
End If
End Sub |
リスト2
上記(リスト2)の「OpenFileDialog1.Multiselect = True」では、ダイアログで複数ファイルの選択を可能にします。
「For Each fileName As String In OpenFileDialog1.FileNames ... Next」では、選択したファイル名を取得します。「strDeletionFile = strDeletionFile + fileName + ControlChars.NullChar」で、選択したファイルのパスを変数 strDeletionFile に格納します。この際、ファイル名とファイル名のターミネータとして Null 文字(ControlChars.NullChar)を追加します。
「With sh ... End With」では、ファイル操作に関する情報を格納します。今回は、ファイルを削除するため、wFunc パラメータに FO_DELETE を設定(「.wFunc = FO_DELETE」)し、fFlags パラメータに ALLOWUNDO を設定(「.fFlags = FOF_ALLOWUNDO」)します。これにより、アンドゥ情報が保持され、ファイルがゴミ箱に入れられます。
そして、「result = SHFileOperation(sh)」で、指定したファイルをゴミ箱に移動させます。
以上の実装を行い、図1 の「ファイルを削除」ボタンをクリックすると、ダイアログが表示されます(図2)。
図
2
図2 のように、複数ファイルを選択し、「開く」ボタンをクリックします。すると、[ファイルの削除の確認]ダイアログ(図2)が表示されます。
図
3
図3 で「はい」ボタンを選択すると、指定したファイルがゴミ箱に移動し、「いいえ」ボタンを選択すると、処理は中断されます。