キーワードによりテキストファイルを全文検索する

C#.net

キーワードによりテキストファイルを全文検索する

Windows 10 / Visual Stadio Community 2019 / .NET Framework 4.7.2 / C# 7.3
指定した検索対象フォルダのサブフォルダも含むファイルに対しテキスト全文検索を行い、指定したキーワードを含むファイルを一覧表に表示する。項目はフォルダ名、ファイル名、キーワードのヒット件数。
列のヘッダをクリックすることによりそれぞれの値でレコードをソートする。レコードを選択し、コンテキストメニューの「ファイルを開く」を選ぶと、ファイルタイプに関連づけられたアプリケーションが起動する。例えば .cs ファイルであれば、Visual Stadioが起動し、エディタに表示する。「Codeでファイルを開く」は、VSCodeが起動し、ファイルを表示する。

検索条件の指定

設定ダイアログにより検索条件を指定する
[image1]

検索対象のファイルタイプの絞り込み

ファイルタイプ(拡張子)を指定して検索対象のファイルを絞り込むことができる。検索対象拡張子を指定すると、その拡張子を持ったファイルのみ読み込まれる。検索除外拡張子を指定すると、その拡張子を持ったファイル以外のファイルが読み込まれる。なお検索対象拡張子に一つでも指定がある場合、検索除外拡張子の指定は無視される。

文字コードの指定

UTF-8、Shift-JIS のいずれかを選ぶ。Windows10では指定なしでテキストファイルを作成すると UTF-8が標準となる。

大文字小文字を区別する

アルファベットの Case Sensitiveの指定と同じ

文字列検索方法

文字列からキーワードを検索する方法。Stringクラスの IndexOfメソッドを使うか、正規表現 Regexクラスの Matchesメソッドを使用するかを選択する。

並列タスク数の選択

1 or 10 のいずれかを選べるが、基本的には10を指定する。 10を指定すると検索処理を10タスクに分割し、サブスレッドにより並行して実行する。直列な処理に比べ処理時間が短縮できる。1は直列処理となる。

マルチタスクの終了を同期する方法

以下のコードは、任意の数の Taskクラスのオブジェクトを作成し、WhenAllメソッドで一斉に起動し、全てのタスクが終了するまで待つ処理である。タスクは ファイルの全文検索を行う launcherメソッドを実行する。(Form2.cs)

複数検索語を指定した場合の検索方法

AND検索とOR検索の場合は、検索語の文字列を空白で分割し、複数の検索語を求める。「AND検索」は、ファイルに指定された複数の検索語が全て含まれていた場合は真となる。「OR検索」は、ファイルに指定された複数の検索語のうち一つでも含まれていた場合は真となる。「文字列をそのまま検索」は、指定されたテキストを空白も含めそのまま検索に使う。

操作方法

対象フォルダの指定は、直接入力するか、選択ボタンによりFolderBrowserDiarogを開きフォルダを選択する。検索語を入力して検索ボタンをクリックする。途中経過がプログレスバーに表示される。キャンセルボタンをクリックすれば処理を中止できる。
[image4]
一覧表からレコードを選択して右クリックするとコンテキストメニューが開く。「ファイルを開く」はファイルタイプのデフォルトのプログラムからファイルを開く。「Codeでファイルを開く」は、Visual Stadio Codeでファイルを開く。「パスをコピーする」は、ファイルのフルパス名をクリップボードにコピーする。
[image2]

設定および状態の保存

検索条件の設定値および、ウィンドウの大きさ、一覧表の列の幅、および対象フォルダのパス名はウィンドウを閉じたときに保存される。次にウィンドウを開いたときはその状態から再開する。アプリケーションのプロパティ設定機能を利用する。

クラス構造図

[image3]

クラス一覧

Form1クラス

メインフォーム
UIコントロールを作成してフォームに配置する。ユーザからのイベントを取得し、処理全体をコントロールする。

Form2クラス

検索処理本体
ディレクトリトラバースにより検索対象ファイルの一覧を取得する。ファイルを読み込み、検索語をキーに正規表現(Regexクラス)によりテキストを全文検索する。検索処理は、ターンアラウンド時間を短縮するために、マルチスレッドにより並列化して実行する。またプログレスバーに処理の進捗率を表示する。

FormSettingsクラス

各種設定値(検索条件等)を入力/更新する。

SearchSettingsクラス

プロパティの機能を利用して各種設定値などの永続化を行う。他にメインフォームのサイズ、グリッドビューの列の幅などの情報も保存する。
Settings.settings

UADataGridViewクラス

結果の一覧を表示する。
DataGridViewオブジェクトを保持する。DataGridViewクラスのサブクラスではない。

【注意事項】

この処理では、テキスト検索の際にファイルの読み込みを行っているので、実行後はファイルの「アクセス日時」が更新されることに留意されたい。