2つのプログラムが同じファイルで動作しているので、最初のプログラムでファイルを定期的にチェックし、変更が加えられた場合はファイルを操作して空にします。他のプログラムはファイルに書き込みます。最初のプログラムから使用されているため、2番目のプログラムがファイルに書き込もうとすると問題が発生します(実装されているC#プログラムがある場合はさらに良い)これを処理するアルゴリズムはありますか?
2 に答える
4
ファイルが変更されたかどうかを確認するには、まずそのタイムスタンプを確認します。擬似コードでは、監視プログラムで次のようなことを試すことができます。
try {
if(FileTimeStampHasChanged(FileName)) {
//Attempt to do something with the file
}
}
catch {
// Handle or ignore the exception if you can't open the file (maybe the other application hasn't finished writing). You can always retry later.
}
ただし、まったく別のアプローチを強くお勧めします。これが私が提案するオプションです。
- 書き込みプログラムを変更できる場合は、一時ファイル(たとえば、output。$$$)に書き込み、書き込みが完了したらすぐに名前を変更します。名前の変更は瞬時に行われ、ロックは発生しません。これは、私の経験では、同時アクセスのための最も簡単なソリューションの1つです。
- 書き込みプログラムを変更できない場合は、読み取りプログラムを変更してください。ポイント1で説明したロジックを使用して、ファイルの名前を変更して、名前を変更したコピーを読み取って処理できるようにします。名前の変更が失敗した場合は、ライターが完了していないことを意味し、後で試行を行うことができます。
- どのプログラムも変更できない場合は、独自の「交通監視員」アプリケーションを作成してポイント1を実装できます。さらに作業が必要ですが、それでも実行可能です。方法は次のとおりです。
- 「出力」などのフォルダーに書き込むようにライターを構成します。
- 「入力」などの別のフォルダから読み取るようにリーダーを構成します。
- 出力フォルダを監視し、ファイルが変更されると入力フォルダに移動するように、TrafficWardenを作成します。移動も瞬時に行われます(名前の変更と実質的に同じ操作です)。
于 2012-04-17T16:41:13.033 に答える
0
FileStreamコンストラクターを使用してFileShare.WriteまたはReadWriteを使用して両方のプログラムでファイルを開くことを探しています。
この方法でファイルを開くと、両方が書き込むことができます。2つのプログラム間で同期メカニズムを手動で実装して、互いのデータが上書きされないようにする必要があることに注意してください。
アクセスパターンによっては、書き込みのたびにファイルを閉じ、開くときにファイルのロックが解除されるのを待つ方が簡単な場合があります。
プログラムの1つを制御できない場合、唯一のオプションは、プログラム内のファイルが完了するまで待つことです(他のプログラムにファイルハンドルを強制的に閉じることはできますが、実行したくないだけです)。データが破損する可能性があるため)。
于 2012-04-17T16:41:54.720 に答える