さまざまな形式(csv、tsv、ini、およびxml)のテキストファイルを処理する複数のWindowsプログラム(Windows 2000、XP、および7で実行)があります。ファイルIO中にこれらのファイルの内容を破損しないことが非常に重要です。すべてのファイルは、複数のプログラムから同時に安全にアクセスできる必要があり、システムのクラッシュに耐える必要があります。このSOの回答は、インプロセスデータベースの使用を示唆しているため、区切り文字のテキストファイル(csv、tsv)を処理でき、トランザクションをサポートするMicrosoft JetDatabaseEngineの使用を検討しています。。以前にJetを使用しましたが、Jetトランザクションがコミットフェーズでの予期しないクラッシュやシャットダウンを本当に許容するかどうか、また、区切られていないテキストファイル(ini、xml)をどうするかがわかりません。完全にACIDicファイルIOを手動で実装しようとするのは良い考えではないと思います。
Windowsでテキストファイルのトランザクション処理を実装するための最良の方法は何ですか?DelphiとC#の両方でこれを実行できる必要があります。
よろしくお願いします。
編集
@SirRufoのアイデアに基づいた例を見てみましょう。並行性を一瞬忘れて、クラッシュ耐性に集中しましょう。
一部のフィールドを変更するために、ファイルの内容をデータ構造に読み込みました。変更したデータをファイルに書き戻す途中で、システムがクラッシュする可能性があります。
データを元のファイルに書き戻さなければ、ファイルの破損を回避できます。これは、変更が保存されるたびにファイル名にタイムスタンプが含まれる新しいファイルを作成することで簡単に実現できます。ただし、これだけでは不十分です。元のファイルはそのまま残りますが、新しく書き込まれたファイルは破損している可能性があります。
タイムスタンプの後に「0」文字を付けることでこれを解決できます。これは、ファイルが検証されていないことを意味します。検証ステップで書き込みプロセスを終了します。新しいファイルを読み取り、その内容を保存しようとしているメモリ内構造と比較し、同じである場合はフラグを「1」に変更します。プログラムはファイルを読み取る必要があるたびに、ファイル名のタイムスタンプを比較して最新バージョンを選択します。最新バージョンのみを保持する必要があり、古いバージョンは削除できます。
同時実行性は、ファイルの読み取りまたは書き込みの前に名前付きミューテックスを待機することで処理できます。プログラムがファイルにアクセスするときは、ファイル名のリストをチェックすることから始めなければなりません。ファイルを読み取りたい場合は、最新バージョンを読み取ります。一方、書き込みを開始できるのは、前回読み取ったバージョンより新しいバージョンがない場合のみです。
これは大まかな、過度に単純化された、非効率的なアプローチですが、私が考えていることを示しています。ファイルの書き込みは安全ではありませんが、ファイルの破損を回避するのに役立つ上記のような簡単なトリックがあるかもしれません。
アップデート
Javaで書かれたオープンソースソリューション: