📌

高速で"OSと仲良くできる"フォルダの使用量計算ツールを作った話

に公開

高速で"OSと仲良くできる"ストレージ解析ツール「Duminous」を作った話

アプリを作ったので公開しました:

https://github.com/Maki-Daisuke/duminous

https://youtu.be/TKpB9NUuPS0?si=kZUqbkE7mLeEsER3

はい、そうです。ストレージの "肥やし" となっているファイルを見つけるやつです。
Windows用とLinux用のバイナリをリリースしています。macOSでも動くと思いますが、動作環境がないので未検証です。

なぜ作ったのか?

この手のソフトと言えば、Windowsなら WinDirStat、Linuxなら ncdu、そしてGo言語界隈ならみんな大好き godu があります。

もうね、何番煎じだよ?っていう話ですが、自分が求めてる機能をドンピシャでそろえているものがなかったんです。
自分が求めていたのはこういうのです:

  1. godu並みに爆速でスキャンできる
  2. ファイルやフォルダを、OSで関連付けられたアプリで開ける
  3. 使い慣れたファイルツリーで使用量を一覧できる
    • マウスでフォルダを開いたり閉じたりできる
    • 当然キーボードでも操作できる
  4. シンボリックリンクなどの特殊なファイルを正しく扱える
    • 特にWindowsのジャンクションとマウントポイント
  5. それ以外の余計なことはしない

で、無いなら自分で作るか。ということで、ついカッとなって作りました。
といっても、大部分はAIさんに書いてもらいました。いい時代ですね。

Duminousの特徴

1. godu並みに爆速でスキャンできる

ちょっとファイルを整理したくてフォルダの使用量を確認したいだけなのに、何十秒もかかるなんて待ってられませんよね。
で、裏で数えさせとこうと思って別の作業をし始めたら最後。数えさせてたことを忘れて、後日また数え直しです。
なので、スキャンが速いことは重要です。速さは正義です。

Duminousなら、180万ファイルくらいある私のホームフォルダが、10秒でスキャンできます:

10.78s. Found 1806395 files.

OK。10秒ならギリギリ待てる。

2. ファイルやフォルダを、OSで関連付けられたアプリで開ける

容量をくっているファイルやフォルダを見つけた時「この画像ってなんだっけ?」ってなりますよね。
そんな時、いちいち探し当てたディレクトリパスをエクスプローラー(とかFinder)で開き直して、画像をプレビューして「ああ、そうだそうだ」って、また元のアプリに戻る。そんなことしていませんか?

違うんだよ!今すぐここでパッと中身を確認したいし、なんなら、サッといつものファイラで開いてもっと深堀りしたいんだよ!

というわけで、OSで関連付けられたアプリで開けるようにしました。OSと仲良くしましょう。

3. 使い慣れたファイルツリーで使用量を一覧できる

ファイルツリー!ファイルツリー!ファイルツリー!
皆ファイルツリー大好きですよね!?(※そんなことはない)
ほら、今もアナタが開いてるVScodeの左側にはファイルツリーが表示されていますよね!

それはさておき、OSと仲良くしてGUIアプリと連携すると決めたなら、ターミナルでの動作にこだわる必要はありません。
なので、ここはやはりデスクトップアプリとして、使い慣れたファイルツリーで表示するようにしました。
マウス操作はもちろん、キーボード操作もいつものように可能です。

使い慣れた操作。実家のような居心地の良さ!これ大事。

4. シンボリックリンクなどの特殊なファイルを正しく扱える

Windowsユーザーである自分にとっては、ある意味でここが一番クリティカルです。

Windowsでディレクトリを再帰的に走査するコードを書いたことがある人なら、一度はハマる罠があります。
そう、 リパースポイント(Reparse Points)、特にジャンクションです。

こいつらを真面目に処理しないと、無限ループしてスタックオーバーフローしたり、同じディレクトリを何度もカウントして「使用量が100TBです(キリッ)」みたいな愉快なバグを生み出します。

シンボリックリンクは Linux や macOS でもおなじみなのでよくご存知かと思いますが、ジャンクション(とマウントポイント)は存在すら知らない人もめずらしくありません。
そんな状況なので、ちゃんと扱っていないソフトもめずらしくありません

「いやいや、そんなマイナーな機能、使われてないんだから無視してもいいでしょ」って思ってませんか?
そう思うなら、あなたも自分のホームフォルダでこのコマンドを実行してみましょう:

Get-ChildItem -Hidden  | Select-Object Name, LinkType

Name                      LinkType
----                      --------
AppData
Application Data          Junction
Cookies                   Junction
Local Settings            Junction
NetHood                   Junction
PrintHood                 Junction
Recent                    Junction
SendTo                    Junction
Templates                 Junction
スタート メニュー           Junction

あなたがショートカットだと思ってるそれ、 全部ジャンクションですよ

というわけで、少なくともユーザーフォルダをスキャンの対象にするなら、ジャンクションを正しく扱う必要があるわけです。

5. それ以外の余計なことはしない

余計なことはいらない。

独自のファイルビュワーをつけてみたり、ストレージの使用状況をグラフ化してみたり、そういうのは一切いらない。
どのフォルダがストレージを食っているのかを、素早く、分かりやすく表示する。その一点だけに集中する。

他にやりたいことがあるなら、他のアプリを使えばよろしい。以上!

まとめ

というわけで、「爆速スキャン」「OSフレンドリー」 を両立させたストレージ解析ツール「Duminous」の紹介でした。

技術的には、Go言語でWailsを使ったデスクトップアプリの開発や、Windowsのジャンクションを攻略するために unsafe で低レイヤーな処理と、個人的にも非常に学びの多いプロジェクトになりました。
まぁ、 コードの99%はAIさんが書いてくれたんですけどね!

ぜひダウンロードして、あなたのストレージの肥やしを見つけ出してください。

https://github.com/Maki-Daisuke/duminous

あと、 Star もらえると作者が小躍りして喜びます。

Discussion