具体的には以下の目的を満たしているものです。
・データを一つのファイルに保存する場合、上書き保存中にアプリケーションがクラッシュした場合に元のファイルが壊れないようしたい。
・データを複数のファイルにまたがって保存する場合、上書き保存中にアプリケーションがクラッシュすると一部のファイルだけ更新されてしまい、全体の整合性が保てなくなるのを防ぎたい。
経験上、「いったんテンポラリな名前のファイルに保存し、全て保存できた事を確認してから本番のファイル名にリネームする」というのが一般的な方法と思っているのですが、他によい方法とか、他に考慮すべき問題等があれば勉強したいと思います。
URLはダミーです。
この類の話はなかなかコレという手がないのが実情ではないかと思います。
DBは使わない(使えない?)ようですので、ファイルのみで行くならこんな感じじゃないでしょうか。
(1)フラグとなるファイルを作成する。
(2)データをテンポラリファイルに保存する。
(3)テンポラリファイルをリネームする。
(4)フラグとなるファイルを消す。
で、フラグとなるファイルが長期間放置されていたら、それを消してくれるようなプログラムを定期的に実行してやれば良いんじゃないでしょうか。
http://d.hatena.ne.jp/dokusha/
磁石と重石の発見
(URLはダミーです)
すでに廃れてしまっている事かもしれませんが、参考までに。MS−DOS、Windowsの場合、“Verify”という機構があります。
まだ盲腸のようについてます。
おぉ、そんなものがあるのですか…。
うっかりカセットテープ時代のBASICコマンドを思い出してしまいました(^^;)。
ありがとうございます(_o_)。
http://support.microsoft.com/default.aspx?scid=kb;ja;JP402706
[XL]上書き保存の際の「ディスク容量がいっぱいです」のエラーについて
logionさんの考え方が一般的と思います。
EXCELでは上記URLのように上書き保存を行っているようです。
複数のファイルにまたがって保存する場合も同じ考え方でできますね。
注意点としては、一時点で2つのファイルができる為、2ファイル分のディスク容量が必要になります。
http://www.atmarkit.co.jp/flinux/rensai/fs04/fs04a.html
@IT:ext3とトランザクション処理(1/2)
トランザクションの考え方があるファイルシステムなら問題無いのですが、FATでは無理です。
http://www.atmarkit.co.jp/icd/root/13/14575813.html
Insider's Computer Dictionary [NTFS] − @IT
NTFSではトランザクションの考え方があるようです。
ただ、どのような場合にロールバックされるのか良くわかりません。
たとえば、microsoftが提供しているソース管理プログラム visual sourse safeは、上記のような事を提案しています。だいたいどのソース管理プログラムも似た機能をもっているので製品仕様にしたがって簡易的に同じような環境を構築することができるのではないでしょうか。
あとは、リスクヘッジの問題ではないでしょうか。誰かがぽかしたとき、何日遡るかの問題だと思います。10人のプロジェクトでも1日ロスしたら10人日。ソース統合管理ソフトの導入を検討する分岐点なのではないでしょうか。
ポイントは誰が更新したのか、どこを更新したのか、以上について世代管理してくれるような開発形式が望ましいかと思います。
勉強される再には品質管理工学を勉強されてはどうでしょうか。
こちらはCVS。フリーのソース管理プログラムです。
CVS には日々お世話になってます。
VSS もそうだと思いますがファイル単位のバージョン管理なので、
複数のファイル間の整合性はあくまで commit する開発者の責任に委ねられているのではないかと思います。
質問はソースコードのバージョン管理ではないのですが、それでも参考になりました。
品質管理工学ですね。以前テスティングをちょっとかじった程度ですのでこれを機に本格的に勉強してみたいと思います。
ありがとうございました。
もし何らかの方法で排他制御をかけたいなら、Mutexを利用する方法もあります。
>フラグのファイル生成は複数起動されてる場合の排他制御のため…と思ってよいでしょうか?
そうではなく、ファイルの保存を開始したよというフラグです。このファイルが存在するということは、保存中であるか保存に失敗したということを意味します。原始的な仕組みですいません。(^^;
なので誤解の無いように書き直すと、
(1)保存開始フラグ代わりのファイルを作成する。
(2)データをテンポラリファイルに保存する。
(3)テンポラリファイルをリネームする。
(4)保存開始フラグのファイルを消す。(保存終了)
で、保存開始フラグの名称にシリアル番号を入れるとか日時を入れるとか、もしくはファイルの作成日付をチェックする等で、失敗したゴミデータがあることを検知してクリーニングすると良いのではないかな、と思ったわけです。
おぉ、なるほど。
ファイルを保存するアプリ自身が書き込み失敗した事に気付かない場合(エラーチェックしない保存コードに手を入れることができないとか…)には特に有効だと思います。
逆に保存コードが多少ええ加減でも安全性を提供できる仕組み、というのは保存部分開発の敷居を下げる大きなメリットがありますね(^^)。
ありがとうございました(_o_)。
また、この場を借りて ohmix1 様にお詫びさせて下さい。
せっかく回答いただいたにも関わらず、僕の操作ミスで ohmix1 様の回答にコメント記入をする前に次の回答に移ってしまい、コメントを記入することができなくなっていました…。
これまでうちの日記(http://d.hatena.ne.jp/logion/20040403)にコメントを書いていたのですが、こちらに移します。
保存の安全性はファイルシステムで提供するのが主流のようですね…。
その場合、複数のファイルに及ぶ保存の際の一貫性はアプリ側の責任に委ねられてしまうのはある意味仕方ないですね…。(アプリが勝手に定義したファイル間の整合性まで、ファイルシステムがケアする事はできないと思うので…)
アプリがファイルシステムに対して「しばらく flush は待ってー」とか通知して、整合性を取る必要のあるファイルをすべてバッファに書き込んでから flush してもらう…なんてのを一瞬考えてみましたが、予め定められたバッファサイズを越えるケースは多々あるでしょうし無理ですね(^^;)。
そこまで密な関連のあるデータを複数のファイルに分けて良いのか、のように保存ファイル群の構造そのものにまで踏み込んで議論すべきなのかも知れませんね…。
ファイルシステムのジャーナリングの仕組には疎かったので、参考になりました。ありがとうございます(_o_)。
ありがとうございます(_o_)。ご指摘の通り DB の使用は考えてませんでした。
フラグのファイル生成は複数起動されてる場合の排他制御のため…と思ってよいでしょうか?