【ITニュース解説】From Scratch: How to Develop a File Search Tool Rivaling "Everything" Using Pure C#
2025年09月04日に「Dev.to」が公開したITニュース「From Scratch: How to Develop a File Search Tool Rivaling "Everything" Using Pure C#」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
C#で高速ファイル検索ツールを開発する手法を紹介。USNジャーナルを読み込み、ファイル情報を取得。Bloomフィルタ類似のインデックスで検索を高速化。UIはAvaloniaを採用し、仮想化UIで大量データを効率的に表示。別スレッドで検索処理を行い、UIの応答性を維持。ホットキー、検索履歴、右クリックメニュー等の機能も実装。ソースコードはGitHubで公開。
ITニュース解説
この記事では、高速なファイル検索ツール「Everything」に匹敵するものを、C#のみで自作する方法を解説している。従来のファイル検索はフォルダを再帰的に探索するため時間がかかるが、USNジャーナルという仕組みを利用することで、より効率的な検索が可能になる。
開発は大きく分けて、データ処理とUIインタラクションの2つの部分から構成される。データ処理では、まずUSNジャーナルからファイル情報を読み込む。USNジャーナルには、ファイル参照番号、親ファイル参照番号、ファイル名などが記録されている。フルパスは直接提供されないため、親の参照情報をもとに組み立てる必要がある。また、ファイルの作成、削除、名前変更といった変更も記録されるため、これらのイベントを監視することで、従来のファイル監視よりも効率的なデータ更新が可能となる。
次に、メモリ内での検索戦略について。単純な文字列の総当たり検索では速度が足りないため、Bloom filterに似た構造のインデックス機構を導入し、事前に計算された「OR」演算によるフィルタリングで検索速度を向上させている。マルチスレッドによる並列処理も試みたが、結果のロック同期によるオーバーヘッドが大きく、コードの複雑さが増す割に性能向上が見られなかった。ピンイン(中国語のローマ字表記)の頭文字検索機能も実装されているが、検索速度に影響するため、削除を検討することも視野に入れている。検索結果は固定長の配列に格納され、上位の結果と合計件数のみを更新するため、オーバーヘッドは小さい。
UIインタラクションにおいては、UIの応答性とレンダリングの効率が重要となる。WinFormsとAvalonia UIフレームワークの両方を試した結果、AOTパブリッシングをサポートするAvaloniaが選択された。これにより、モダンなUIを維持しつつ、WinFormsと同等の性能を達成できる。
ユーザー入力への応答と文字列照合は別々のスレッドで実行し、非同期シグナリング機構を用いて検索タスクをトリガーまたはキャンセルすることで、UIスレッドのブロックを回避している。検索タスクは永続的なループで実行し、スレッドの作成と破棄のオーバーヘッドを避けている。
大量のデータをリアルタイムに表示するため、仮想化UIが不可欠となる。WinFormsではListViewの仮想モードを使用し、AvaloniaではListBoxの仮想化ソリューションとReactiveUIフレームワークを組み合わせ、DataContextを可変長データモデルにバインドしている。検索結果が更新されるたびに、IEnumerableインターフェースを通じて表示項目が遅延生成され、スムーズなレンダリングを実現している。ファイルパスとアイコンは動的に取得される(キャッシュの導入も可能)。アイコンの非同期ロードはちらつきの原因となるため、同期的な取得に変更することで安定性が向上している。
さらに、グローバルホットキー、検索履歴、カスタム右クリックメニューなどの機能も実装し、実用性とパーソナライズを強化している。
このツールは完全にオープンソースであり、GitHubで公開されている。