あなたの質問へのコメントで示唆されたように、SQLiteのようなデータベースを使用することは非常に良い解決策かもしれません。ただし、ファイルの使用を主張する場合は、もちろんこれは可能です。
私は一度それを自分で行いました-ファイルを使用してディスク上に永続的なキューを作成しました。
これを実現する方法に関するガイドラインは次のとおりです。
- ファイルには、次の未処理のレコード(エントリ)と書き込み可能な次の場所を指すヘッダーが含まれている必要があります。
- レコードの長さが可変の場合、各レコードには、レコード長を示すヘッダーが含まれている必要があります。
- 各レコードに、レコードが処理されたかどうかを示すフラグを追加することをお勧めします
- ファイルロックを使用して、書き込み中のファイルの部分から誰も読み取らないようにすることができます
- 低レベルのIOを使用する-いかなる種類のバッファリングされたストリームも使用せず、直接書き込みセマンティクスを使用します
そして、これが読み取りと書き込みのスキームです(おそらくいくつかの小さな論理的なバグがありますが、そこからそれを取ることができるはずです):
読者
- ファイルヘッダーをロックして読み取り、ロックを解除して元に戻します
- 最後のレコード位置に移動します
- レコードヘッダーとレコードを読み取ります
- 処理済みフラグをオンにして、レコードヘッダーを書き戻します。
- ファイルの終わりにいない場合は、ヘッダーをロックし、次の未処理のレコードの新しい場所を書き込みます。それ以外の場合は、処理するレコードがこれ以上ないことを示すマーキングを書き込みます。
- 書き込む次のレコードが正しい場所を指していることを確認してください
また、リーダーにファイルをときどき圧縮してもらいたい場合もあります。
- ファイル全体をロックする
- すべての未処理のレコードをファイルの先頭にコピーします(未処理のレコードを上書きしないようにロジックを保持することをお勧めします-処理済みのスペースが未処理のスペースよりも大きい場合にのみコンパクトにすることができます)
- ヘッダーを更新します
- ファイルのロックを解除する
作家
- ファイルのヘッダーをロックし、次のレコードが書き込まれる場所を確認してから、ロックを解除します
- 書き込む場所からレコードの長さまでファイルをロックします
- レコードを書き込んでロックを解除します
- 未処理のレコードマークが処理するレコードがないことを示している場合はヘッダーをロックし、新しいレコードを指すようにしますヘッダーのロックを解除します
これが書き込みトラックにあなたを設定することを願っています