find-my-files

Windows 専用のファイル名検索。NTFS の $MFT を直接読み、 USN ジャーナルで更新を反映する。Rust エンジンと WinUI 3 UI。 ファイル名のみを索引する。

Apache-2.0 ライセンス · Windows 10/11 (NTFS)

仕組み

  • $MFT 直読みによる初回インデックス — NTFS の Master File Table を直接読み、1ボリュームあたり数秒で全ファイル名を取り込む。
  • USN ジャーナルによる更新 — 変更通知は USN チェンジジャーナルから取得。ファイル監視・再スキャンは不要で、変更は約1秒で UI に届く。
  • マルチスレッド検索 — インメモリ索引上を部分一致で走査。100万件・3文字以上で p99 ≤ 50ms。
  • ネイティブ WinUI 3 — Mica、ダークテーマ、Per-Monitor V2 DPI。
  • 省メモリ — ファイル名のみを索引するため、100万件で約100MB。
  • 権限分離 — MFT/USN 読み取りの特権は Windows サービスに分離。UI は非特権で、同一ユーザー限定の名前付きパイプで通信する。

スコープ外

ファイル名のみを索引する。以下は対象外。

  • content 検索
  • プロパティ・タグ索引
  • プレビュー
  • FTP / HTTP サーバ
  • FAT / exFAT / ネットワークドライブ
  • ReFS
  • クロスプラットフォーム

性能目標

最終マイルストーンで満たす数値目標。

指標目標
初回インデックス(実C:)25万 ≈ 5s / 100万 ≈ 60s
検索 p99(100万件・3文字以上)≤ 50 ms
変更反映(USN → UI)≤ 1 s
スナップショット復元 → ready≤ 2 s
RAM(エンジン単体・バイト/ファイル)≤ 110 B

アーキテクチャ

既定は非特権 UI + サービス。サービス未導入時は昇格 in-proc フォールバック。

WinUI 3 app(C#・非特権) ──named pipe──▶  fmf-service(Rust・LocalSystem)
   └─ IEngineClient 境界                       └─ fmf-core: $MFT走査・USN tailing・
       ├─ PipeEngineClient(既定)                  インメモリ索引・クエリエンジン
       └─ FfiEngineClient ──P/Invoke──▶  fmf_engine.dll(昇格in-procフォールバック)

はじめる

ツールチェーンは mise で固定、タスクは just。

mise install        # rust + dotnet
just setup          # toolchain + git hooks
just build          # エンジン(cargo, release)
just service-install  # サービス登録(昇格・一度だけ)

ビルド済みバイナリは Releases から。