この記事では、AutoIt を使って作成する、実用的なファイル検索ツールの全コードとその仕組みを解説します。
このツールは、指定した場所から特定の拡張子を持つファイルを検索し、結果をリストに一覧表示します。
さらに、リストからファイルを選択してボタンをクリックすると、そのファイルが保存されているフォルダーを、該当ファイルが選択された状態で開くことができます。
目次
完成したスクリプトの全コード
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <GuiListView.au3>
#include <WinAPIShellEx.au3>
; ### GUIの定義 ###
Local $hGUI = GUICreate("ファイル検索ツール", 700, 400)
Local $idListView = GUICtrlCreateListView("ファイル名|ファイルの場所", 10, 10, 680, 340)
_GUICtrlListView_SetColumnWidth($idListView, 0, 200)
_GUICtrlListView_SetColumnWidth($idListView, 1, 460)
Local $idSearchButton = GUICtrlCreateButton("検索開始 (F5)", 10, 360, 150, 30)
Local $idOpenFolderButton = GUICtrlCreateButton("選択したファイルのフォルダーを開く", 170, 360, 250, 30)
; ### アクセラレータキー(ショートカット)の設定 ###
Local $aAccelKeys[1][2] = [["{F5}", $idSearchButton]]
GUISetAccelerators($aAccelKeys, $hGUI)
GUISetState(@SW_SHOW, $hGUI)
; ### メインループ ###
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idSearchButton
_SearchFiles()
Case $idOpenFolderButton
_OpenSelectedFileFolder()
EndSwitch
WEnd
Exit
; ### ファイル検索とリスト表示を行う関数 ###
Func _SearchFiles()
Local $sRootFolder = FileSelectFolder("検索したい場所を選択してください。", "")
If @error Then Return
_GUICtrlListView_DeleteAllItems($idListView)
Local $sTargetExt = ".tmp"
Local $aFileList = _FileListToArrayRec($sRootFolder, "*" & $sTargetExt, $FLTAR_FILES, $FLTAR_RECUR, 0, 2)
If @error Then
MsgBox(0, "情報", "対象のファイルは見つかりませんでした。")
Return
EndIf
For $i = 1 To $aFileList[0]
Local $sFullPath = $aFileList[$i]
Local $sFileName = StringMid($sFullPath, StringInStr($sFullPath, "\", 0, -1) + 1)
_GUICtrlListView_AddItem($idListView, $sFileName)
_GUICtrlListView_AddSubItem($idListView, $i - 1, $sFullPath, 1)
Next
EndFunc
; ### 選択されたファイルのフォルダーを開く関数 ###
Func _OpenSelectedFileFolder()
Local $iSelectedIndex = _GUICtrlListView_GetNextItem($idListView)
If $iSelectedIndex = -1 Then
MsgBox(0, "情報", "リストからファイルを選択してください。")
Return
EndIf
Local $sFullPath = _GUICtrlListView_GetItemText($idListView, $iSelectedIndex, 1)
Local $sFolderPath = StringLeft($sFullPath, StringInStr($sFullPath, "\", 0, -1) - 1)
Local $sFileName = StringMid($sFullPath, StringInStr($sFullPath, "\", 0, -1) + 1)
Local $aItemsToSelect[1] = [$sFileName]
_WinAPI_ShellOpenFolderAndSelectItems($sFolderPath, $aItemsToSelect)
EndFunc
コードの詳しい解説
GUI の作成と設定
スクリプトの前半部分では、アプリケーションの「見た目」と基本的な設定を行っています。
- ウィンドウとコントロールの作成:
GUICreateでメインウィンドウを、GUICtrlCreateListViewで検索結果を表示するリスト部分を、GUICtrlCreateButtonで 2つの操作ボタンをそれぞれ作成し、配置します。 - リストビューの列定義:
GUICtrlCreateListViewの第一引数で、"ファイル名|ファイルの場所"のようにパイプ記号|で区切ることで、2つの列を持ったリストビューを作成しています。 - 列幅の調整:
_GUICtrlListView_SetColumnWidthを使い、各列の幅をピクセル単位で指定し、表示のバランスを整えています。 - ショートカットキーの設定:
GUISetAcceleratorsを使い、F5キーで「検索開始」ボタンが動作するように割り当て、利便性を高めています。
メインイベントループ
While...WEndループは、GUIアプリケーションの心臓部です。
ユーザーからの操作を待ち受け、GUIGetMsgで発生したイベントの種類に応じて、Switch文で処理を振り分けます。
ボタンがクリックされると、それぞれに対応した関数を呼び出します。
ファイル検索の実行
_SearchFiles関数が、検索とリスト表示の処理を担います。
- 検索場所の選択:
FileSelectFolderで、ユーザーに検索を開始する場所を選ばせます。 - リストの初期化: 新しい検索の前に
_GUICtrlListView_DeleteAllItemsを呼び出し、前回の検索結果がリストに残っている場合は綺麗に消去します。 - ファイルの検索:
_FileListToArrayRecを使い、サブフォルダーを含めた全ての場所から、指定した拡張子を持つファイルを検索します。第 6引数の2で、結果を常にフルパスで取得するように指定しているのが重要です。 - リストへの追加: 検索で見つかったファイルを
Forループで一つずつ処理します。_GUICtrlListView_AddItemで 1列目にファイル名を、_GUICtrlListView_AddSubItemで 2列目にそのファイルのフルパスを追加しています。
選択したファイルのフォルダーを開く
_OpenSelectedFileFolder関数が、このツールの便利な機能を実現します。
- 選択項目のチェック: まず、リストの項目が何も選択されていない状態でボタンが押された場合に備え、
_GUICtrlListView_GetNextItemで選択状態を確認し、選択されていなければメッセージを出して処理を中断します。 - パスとファイル名の取得:
_GUICtrlListView_GetItemTextで、選択された行の 2列目からファイルのフルパスを取得します。その後、StringLeftやStringMidといった文字列操作関数を使い、フルパスを「フォルダーのパス」と「ファイル名」に分割します。 - フォルダーを開いてファイルを選択: 最後に
_WinAPI_ShellOpenFolderAndSelectItems関数を呼び出します。この関数にフォルダーのパスと、ファイル名を格納した配列を渡すことで、「フォルダーを開き、かつその中の特定のファイルを選択状態にする」という高度な動作を実現しています。

コメント