テキストエディタやワードプロセッサなど、ユーザーが作成したファイルに書き込むプログラムがあるとします。クラッシュ、スペース不足エラー、突然の停電、競合状態などに直面した場合のデータ損失または破損のリスクを最小限に抑えるために、どのような手順を実行する必要がありますか?
4 に答える
重要なデータを保護するための経験則は次のとおりです。
唯一のコピーを変更しないでください
ワードプロセッサやテキストエディタの場合、すべての変更が加えられた元のファイルのコピーである「シャドウコピー」(これは専門用語ではない場合があります)を作成するのが標準であると思います。定期的に(またはユーザーが要求したときに)、元のファイルに対する変更を含む保存を強制することができます。これの利点は、いつでも障害が発生した場合に、データの有効なコピーが常に少なくとも1つ存在することです。
本当の目標は、原子性を実現することです。操作は成功または失敗するだけで、不完全な状態になることはありません。「シャドウコピー」以外にもアトミック性を実現する方法はたくさんありますが、これがテキストエディタが行う方法だと私は信じています。
SQLiteを使用する
ええと、わかりました。テキストエディタにDBを使用するのは奇妙ですが、ワードプロセッサには非常に多くの状態があるため、ある程度意味があるかもしれません。確かに、多くの種類のアプリケーションのストレージ形式としては理にかなっています。SQLite wikiサイトに、元にたり/やり直しのログに使用する方法についてのページがあります。
テキストエディタの場合、データベースが行う手法を使用できます。ログ先行書き込みまたはロールバックログ、およびディスクとの適切なコミット同期です。または、すべてのファイルの2つのバージョンを保存できます。
ここにも当てはまる同様の問題に対する以前の回答を書きました。手順は次のとおりです。
- 新しいデータを使用して一時ファイルを作成します
- 一時ファイルを元のファイルのディレクトリにあるバックアップファイルに移動します。
- バックアップと元のファイルのアトミックスワップを実行します(WindowsではFile.Replace、Unixではiノードをスワップします)。
- バックアップ(現在は元の)ファイルを削除します。
これは、今日の数ギガバイトのマシンではおそらく時代遅れですが、Macで開発するとき、保存操作を実行するのに十分な大きさのメモリブロックを割り当てていたのを覚えています。
メモリが不足した場合は、ユーザーにメモリが不足していることを警告してから、そのブロックを解放して、実際の保存操作を実行できるようにします。
ユーザーデータを保存するために重要な他の機能は、元に戻すを提供することです-理想的には無制限の元に戻す/やり直し。