

Public Class FileSearchDialog
Inherits System.Windows.Forms.Form
#Region "Windowsフォームデザイナで生成されたコード"
... (省略) ...
#End Region
' 内部変数
Private m_files As String() ' 選択されたファイルの配列
Private m_pattern As String ' 検索する文字列のパターン
' プロパティ : 選択されたファイルの配列
Public ReadOnly Property Files() As String()
Get
Return m_files
End Get
End Property
' ロードイベント : 初期化
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
rbnInclude.Checked = True ' 「...を含む」ボタンにチェックを入れる
chkSubfolder.Checked = True ' 「サブフォルダも探す」にチェックを入れる
End Sub
End Class
' エラーのチェック
Private Function IsError() As Boolean
' エラーの内容を示す文字列
Dim strError As String = ""
' 検索文字のチェック
If txtFind.Text = "" Then
' 空文字のチェック
strError &= "検索文字列が入力されていません。" & vbCrLf
Else
' 無効な文字のチェック
If InStr(txtFind.Text, IO.Path.AltDirectorySeparatorChar) <> 0 Then
strError &= "検索文字列に「" & IO.Path.AltDirectorySeparatorChar _
& "」は使用できません。" & vbCrLf
End If
If InStr(txtFind.Text, IO.Path.DirectorySeparatorChar) <> 0 Then
strError &= "検索文字列に「" & IO.Path.DirectorySeparatorChar _
& "」は使用できません。" & vbCrLf
End If
If InStr(txtFind.Text, IO.Path.VolumeSeparatorChar) <> 0 Then
strError &= "検索文字列に「" & IO.Path.VolumeSeparatorChar _
& "」は使用できません。" & vbCrLf
End If
If InStr(txtFind.Text, IO.Path.PathSeparator) <> 0 Then
strError &= "検索文字列に「" & IO.Path.PathSeparator _
& "」は使用できません。" & vbCrLf
End If
Dim c As Char
For Each c In IO.Path.InvalidPathChars
If InStr(txtFind.Text, c) <> 0 Then
strError &= "検索文字列に「" & c & "」は使用できません。" & vbCrLf
End If
Next
' 検索条件のチェック
If rbnInclude.Checked Then
m_pattern = "*" & txtFind.Text & "*"
ElseIf rbnBegin.Checked Then
m_pattern = txtFind.Text & "*"
ElseIf rbnEnd.Checked Then
m_pattern = "*" & txtFind.Text
ElseIf rbnWhole.Checked Then
m_pattern = txtFind.Text
Else
strError &= "検索条件が選択されていません。" & vbCrLf
End If
End If
' 検索場所のチェック
If txtPlace.Text = "" Then
' 空文字のチェック
strError &= "検索場所が入力されていません。" & vbCrLf
Else
' 区切り文字のチェック
If txtPlace.Text.EndsWith("\") = False Then
txtPlace.Text &= "\"
End If
' フォルダの存在のチェック
If IO.Directory.Exists(txtPlace.Text) = False Then
strError &= "検索場所が見つかりません。" & vbCrLf
ElseIf (GetAttr(txtPlace.Text) And FileAttribute.Hidden) = FileAttribute.Hidden Then
' 属性のチェック
strError &= "このフォルダにはアクセスできません。" & vbCrLf
End if
End If
' 値を返す True | False
If strError <> "" Then
' エラーがあるときはメッセージを表示して True を返す
MessageBox.Show("エラー :" & vbCrLf & strError, "ERROR", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return True
Else
' エラーがないときは False を返す
Return False
End If
End Function
' ファイルの検索
Private Sub SearchFiles(ByVal folder As String, ByVal pattern As String)
' ファイルを取得してListBoxに追加
Dim aFiles As String() = IO.Directory.GetFiles(folder, pattern)
lstResult.Items.AddRange(aFiles)
' サブフォルダも探す時
If chkSubfolder.Checked Then
' folderのサブフォルダを取得する
Dim aSubfolders As String() = IO.Directory.GetDirectories(folder)
Dim strSubfolder As String
' サブフォルダにあるファイルも調べる
For Each strSubfolder In aSubfolders
' 再帰処理
If (GetAttr(strSubfolder) And FileAttribute.Hidden) <> FileAttribute.Hidden Then
SearchFiles(strSubfolder, pattern)
End If
Next
End If
End Sub
' 検索ボタンのクリック : 検索の開始
Private Sub btnFind_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnFind.Click
' リストボックスと配列のクリア
lstResult.Items.Clear()
m_files = Nothing
' エラーのチェック
If IsError() Then Exit Sub
' 検索の開始
Cursor.Current = Windows.Forms.Cursors.WaitCursor ' カーソルの変更
Try
SearchFiles(txtPlace.Text, m_pattern) ' 検索の実行
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
' すべての項目を選択状態にする
' (OKボタンですぐにすべてのファイルを返せるようにするため)
Dim nCount As Integer = lstResult.Items.Count
Dim i As Integer
For i = 0 To nCount - 1
lstResult.SetSelected(i, True)
Next
Cursor.Current = Windows.Forms.Cursors.Default ' カーソルを戻す
' ヒット件数の表示
MessageBox.Show("検索の結果、" & CStr(nCount) & "件のファイルが見つかりました。", _
"検索結果", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
' OKボタンのクリック
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnOK.Click
Dim nCount As Integer = lstResult.SelectedItems.Count
If nCount > 0 Then
'選択したファイルの配列を取得
ReDim m_files(nCount - 1)
lstResult.SelectedItems.CopyTo(m_files, 0)
End If
End Sub