最近、作り込んでいる はてなブロククライアント だが、投稿テキストをテキストエディターで編集した後、os.Remove で削除していた。だが、何らかのトラブルがあって投稿が失敗したのに検知できなかったという最悪ケースのため、完全削除よりは、復元できた方が安全だ。こういう場合に OS ゴミ箱が使うとよいかもしれない。
Windows の場合は、OS自体にゴミ箱機能が組み込まれていて、
- COM: Shell.Application の MoveTo メソッド
- Shell32.dll の SHFileOperationW
などを使って、任意のファイルをゴミ箱へ移動させることができる。
Linux の場合、デスクトップ環境が統一されていないため、ゴミ箱について OS としての統一の API はなく、かわりに各デスクトップ環境で共通化するための仕様がある。
抜粋すると次のようなものになる
- システムには一つ以上のゴミ箱ディレクトリがある
- ゴミ箱ディレクトリには、files, info という二つのサブディレクトリがある
- files には元ファイルそのものを、
(ユニークな名前)
に改名して移動する(ユニークな名前)
は他と衝突しない名前であればよいが、削除したファイルの名前をそのまま使ってはいけない(同じ名前のファイルを何回も捨てることだってある)
- info には元ファイル情報を記録する
(ユニークな名前).trashinfo
というテキストファイルを削除単位ごとに作成する
- files には元ファイルそのものを、
[Trash Info] Path=foo/bar/meow.bow-wow DeletionDate=20040831T22:32:08
[size] [mtime] [percent-encoded-directory-name]
以上を踏まえて、以前、Rust で作ったゴミ箱コマンド を Go に移植してライブラリ化し、あわせて、非Windows にも FreeDesktop.org 準拠型として対応した。
v0.2.0 時点では
- "home trash" のみ。各ファイルシステムごとの $topdir/.Trash には未対応
- ファイルシステムが違っていて move できないファイル・ディレクトリについては、対象を copy & move する。それゆえレスポンスが悪い場合がある
- WSL で使う場合 Windows上のファイルがユーザのホームディレクトリ外にあるため。はてなブログクライアント は WSL で使いたいため、WSLで全く動作しないというのも困る
- "home trash" や、そのサブディレクトリ files , info が存在しない場合でも、自動的に作成する
- GUI なしの WSL 環境では、これらが存在しないため
(ユニークな名前)
として、UUIDv4 を使用- 手動で復元するやつなんて、おらんやろ…
テストとして WSL 以外に、VirtualBox上のUbuntu 環境で、本ライブラリで削除したファイルがデスクトップのゴミ箱できちんと表示され、そこから復元もできることを確認した。
そして、はてなブログクライアントも、これを使うよう修正した。