はじめに
Pythonで開発しているタブ型・プレビュー付きのファイル検索アプリ「FileSearchExplorer」、前回の記事ではv0.3の大型アップデート(高速化・検索キャンセル・DB最適化など)についてご紹介しました。
今回はその続報として、v0.4betaをリリースしました。今回の目玉は、ずっと欲しかった「ファイルの中身を検索する機能」です。まだbeta版という位置づけですが、実際に自分で使いながらブラッシュアップしていきたいと思っています。
GitHubリポジトリはこちら:
https://github.com/Unknown777hello/FileSearchExplorer
v0.4betaでの主な進化ポイント
ファイル内容検索機能を追加
これまでは「ファイル名」にキーワードが含まれているかどうかでしか検索できませんでした。今回から、txt・py・md・json・htmlなどのテキスト系ファイルであれば、中身にキーワードが含まれているかどうかも検索対象にできるようになりました。
検索条件エリアの「ファイル内容も検索(テキスト系のみ)」にチェックを入れるだけでON/OFFを切り替えられます。ヒットした場合は「何行目のどのあたりで一致したか」を抜粋つきで結果一覧に表示するので、大きなファイルの中から目的の記述を探すのがかなり楽になりました。CSVエクスポートにもこの一致箇所を出力できます。
インデックス検索との使い分け
FileSearchExplorerには「インデックスを使用する(高速)」というオプションがあり、事前にフォルダをSQLiteへ登録しておくことで2回目以降の検索を一瞬で終わらせられます。ただ、このインデックスDBに登録しているのはファイル名などのメタ情報だけで、ファイルの中身までは保存していません。
そのため、内容検索を有効にした状態でインデックス検索も同時にONにしていた場合は、自動的に通常検索(実フォルダを直接読みにいく方式)にフォールバックするようにしました。ユーザー側で意識しなくても、常に正しい結果が返るようにするための対応です。
簡易プレビューのエラー表示を改善
内容検索の実装とあわせて、簡易プレビュー機能まわりの見直しも行いました。ログファイルなど、他のアプリが書き込み中で排他ロックされているファイルをプレビューしようとすると、これまでは[Errno 13] Permission deniedのような生の例外メッセージがそのまま表示されてしまっていました。
今回から、アクセス拒否とファイルが見つからない場合をそれぞれ判別し、「他のアプリで使用中の可能性があります」といった原因が伝わりやすいメッセージに変更しています。
開発の裏話
内容検索を作るうえで一番気をつけたのが「バイナリファイルを誤って読み込んでしまわないか」という点でした。テキストファイルはutf-8で読めなければcp932、それでもダメならlatin-1、と複数のエンコーディングを順番に試す作りにしているのですが、latin-1はどんなバイト列でも一応「読めて」しまうため、対象を絞らないと実行ファイルなどのバイナリを開いて意味不明な文字列の中からたまたまキーワードっぽい並びを拾ってしまう、ということが起こり得ます。
そこで、内容検索の対象はプレビュー機能と同じ「テキスト系だとわかっている拡張子」に限定し、さらに5MBを超えるファイルはスキップするようにしました。地味な制限ですが、誤検知を防ぎつつ実用的な速度を保つには重要なポイントだったと思います。
まだbeta版なので、実際にいろいろなフォルダで使ってみて、動作や使い勝手のフィードバックをいただけると助かります。
最後に(WindowsならPython不要で動きます)
今回もPython環境がないPCでも、Windows環境(10/11 64bit)ならReleasesからzipをダウンロードするだけでそのまま単体で動きます。
ファイル名だけでなく中身まで探せるようになったことで、より「自分だけの最強検索ツール」に近づいてきた気がしています。
バグ報告や「こんな機能が欲しい!」といったフィードバックは、引き続きGitHubのIssuesでお待ちしています。ぜひスターもポチッとお願いします!
最新版のダウンロード(Releases):
https://github.com/Unknown777hello/FileSearchExplorer