まだWindowsが98あたりが全盛期だった頃、ウェブサイト巡回ツールなるアプリケーションを利用していました。
巡回するサイトはアプリケーションが管理するファイルに記録されていました。まあ、普通ですね。
当時私は学生かアルバイトか派遣社員で貧乏だったので、HDDは大して良いものを使っておらず、すぐに空き領域はギリギリの環境でした。
(今でもSSDを使おうと思うほど気持ちは裕福ではありません…)
そうした苦労から考え出したのがDisk list makerだったのですが、
Windowsは、と言うかファイルAPIの仕様だと思うのですが、ファイルを上書きする時に、既存のファイルの大きさを超えるような場合で、更にその超過分をHDDの空き領域に割り当てる事ができない場合、どのような挙動をするのかと言うと、
“既存のファイルを0バイトのファイルで上書きする”
というものでした。
お陰で度々大事な設定を闇に消し去られました。まあ、大事なものはバックアップしておけってのは今も昔も変わらないのですが、「つい」「うっかり」をやってしまうのが人間です。
先日、WinMergeでGitで管理されたファイルの編集をしていた時、突然OSがプツンと落ちました。
オーバークロックとかはしていないのですが、何しろ自作PCなので、恐らくはハード関係に起因するハングアップや突然の再起動はたまにあります。
で、再起動した後に編集途中だったファイルをもう一度開こうとしたら、ファイルがありません。
修復ツールで修復を試みましたが、既に別のファイルでセクタは上書きされていたため、修復もできませんでした。
幸いバックアップは取っていたので大事には至りませんでしたが、Gitとかでローカルで作業をしていると忘れがちになるのは私だけではないと思うのですが。
改めてフェイルセーフとは何か。と考えました。
この場合ではWinMergeに原因があるのか特定できていませんが、HDD上のファイルは書込み待ち状態になっていたと思われます。ユーザーが“更新”を実行しない限り、アプリケーションはファイルに対しWrite権限を持つべきではないでしょう。
そして前述の巡回ツールの場合では、ファイル上書きのアルゴリズムの改善が必要だと思います。恐らく既存は以下のようなものだと思います。(フローチャート書くのが面倒なので失敗パターンのみ)
↓
[ファイルの内容を消去]
↓
[メモリからファイルへデータをコピー]
↓
(空き領域不足により失敗)
↓
(終了)
フェイルセーフを考慮すれば、これは以下のようにするべきではないでしょうか。フラグメント等も当然考慮して計算する前提です。
↓
[既存ファイルの大きさと空き領域の和がメモリ上のデータを収めるに足るか計算]
↓
(計算結果が条件を満足しない事により中断)
とは言ったもののIO周りの低級なAPIでここまで親切な実装をすることはないでしょうね。
自分で安全な上書きアルゴリズムを作るしかなさそうです。
Project Flowerのアプリケーションも親切ではないのでHDD空き領域には余裕を持って利用して下さい…。