ファイル検索ダイアログ

VB SampleFileSearch DialogBox
 ファイルを検索するためのダイアログボックスのサンプルです。このダイアログは、指定された条件からファイル名の配列を取得し、さらにその中からユーザーが選択したファイル名の配列を返します。

【INDEX】 ・フォームの設計と初期化 / ・エラー・チェック / ・ファイルの検索 / ・イベント処理
(作成環境 : VB .net 2002 / Framework SDK 1.0)

■フォームの設計と初期化

 フォームの概要は上図の通りです。以下、デフォルト値以外のプロパティで主なものを示しておきます。
FileSearchDialog
... FormBorderStyle : FixedDialog
... MaximizeBox / MinimizeBox : False
txtFind
... MaxLength : 256 ・・・ ファイル名の最大長
txtPlace
... MaxLength : 260 ・・・ パス名の最大長
lstResult
... SelectionMode : MultiExtended ・・・ Shift(範囲選択)/Ctrl(複数選択)キー使用可
btnOK
... DialogResult : OK
... FlatStyle : Popup
btnCancel
... DialogResult : Cancel
... FlatStyle : Popup
 以下は、宣言部と初期化のコードです。フォームのロードと同時にラジオボタンを選択しています。
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	
| ▲TOP |

■エラー・チェック
 以下の関数では、エラーをチェックし、エラーがあれば True、なければ False を返します。各項目では次のようなチェックを行う必要があります。
@検索文字
... 空文字かどうか
... 無効な文字(\, ;, ", <, > など)が含まれているかどうか
A検索条件
... 項目が選択されているかどうか
B検索場所
... 空文字かどうか
... 末尾が \ がどうか (フォルダ名の末尾は \ である必要があります)
... フォルダが存在するかどうか
... フォルダがアクセス可能(隠し属性でない)かどうか
 Aの検索条件のチェックで、検索文字のパターンを設定しています。正規表現と同じように、指定子 "*" が使用できます。これは0文字以上の文字列を表すワイルドカードと呼ばれます。例えば、 "*abc*" とすれば、前に0文字以上の文字列、間に "abc" 、後ろに0文字以上の文字列を組み合わせた文字列を表します。 "abcx" "xabc" "xabcx" "xxxabcxxx" のいずれもがこれに該当します。
' エラーのチェック
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	
| ▲TOP |

■ファイルの検索
 あるフォルダの中にあるファイルは、System.IO 名前空間の Directory クラスから取得できます。この時、引数にフォルダ名と、検索パターンを指定します。また、「サブフォルダも探す」にチェックが入っている時は、サブフォルダ一覧を取得して、再帰処理で同様にファイルを取得します。ただし、ここでは隠し属性のフォルダを除いています。
' ファイルの検索
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	
| ▲TOP |

■イベント処理
 検索開始ボタンのクリックで、ファイルを取得し、リストボックスに表示します。さらに、OKボタンのクリックで、リストボックス内の選択されたファイル名を配列にして返します。
' 検索ボタンのクリック : 検索の開始
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

| ■HOME | ◆プログラムTop | ▲ページの先頭 |