2

XmlSerializer を使用して、現在のユーザーが作業しているプロジェクトを XML ファイルとの間でシリアル化および逆シリアル化する C#.NET プログラムを作成しています。これは正常に動作していますが、2 人のユーザーがネットワーク ドライブから同じファイルを開き、1 人のユーザーが前のユーザーの保存を上書きするのを防ぐ方法を見つけようとしています。私は基本的に、MS Word の動作が必要です。プログラムがファイルを開くときにファイルへの書き込みアクセスを取得できない場合、ファイルは読み取り専用モードで開かれます。

では、ファイルへのアクセスをロックするにはどうすればよいでしょうか。ファイル ストリーム オブジェクトを開いたままにして、それへの参照を保持するだけですか? 保存ごとにファイル ストリーム オブジェクトを開いたり閉じたりするのではなく、中間保存に同じファイル ストリーム オブジェクトを使用し続けますか? または、ファイルへのアクセスをロックする他の方法はありますか?

また、アプリがクラッシュした場合でもファイルが確実にリリースされるようにするにはどうすればよいですか? これは IDisposable を実装する良いケースでしょうか?

4

3 に答える 3

5

FileStream.LockメソッドとFileStream.Unlockメソッドを使用できます。

于 2010-02-20T01:30:54.427 に答える
2

メソッドを使用してファイルへのファイル ストリームを開く場合は、パラメーターを受け取るオーバーロード ( this one )File.Openを必ず使用してください。これをさまざまな値に設定して、使用中にストリームがファイルをロックする方法を指定できます (つまり、他のプロセスによる読み取りを許可するが書き込みは許可しない、他のプロセスによる使用を禁止する)。他のプロセス (またはプロセス内の別のストリーム) がファイルにアクセスできないようにするには、この値が必要です。FileShareNone

ファイルが確実に解放されるように、作業が終了したら必ず を閉じてFileStreamください。アプリケーションがクラッシュした場合でも確実に閉じられるようにするために、特に何もする必要はありません。アプリケーションがクラッシュすると、そのプロセスが終了し、ロックが解除されます。

于 2010-02-20T01:39:52.767 に答える
2

これを機能させるために特別なことをする必要はありません。まず、FileAccess.ReadWrite と FileShare.Read でファイルを開こうとします。IOException が発生しない場合は、ファイルへの排他的な書き込みアクセスが許可されます。他のプロセスはファイルから読み取ることはできますが、書き込みアクセスを取得することはできません。

そのオープンの試みが失敗した場合は、他の誰かが既にファイルを書き込み用に開いていると見なすことができます。ここで、内部プログラム ロジックを「読み取り専用」モードに切り替え、FileAccess.Read および FileShare.ReadWrite を使用してファイルを開きます。それでも問題が解決しない場合は、ファイルに根本的な問題があり、IOException がその内容を示します。

「ファイルがロックされているか」テストを避けるように十分に注意してください。これはネットワーク上では確実に機能しません。ファイルにアクセスした後は、ファイルを開いたままにしておく必要があります。閉じるとすぐに、ナノ秒後に別のプロセスがアクセスできるようになります。

この種のロックに関するもう 1 つの典型的な問題は、ユーザーが通常、誰がファイルをロックしているかを知りたいということです。Windows では、これを確認するための標準的な方法は提供されていません。Office は、ファイルと同じ名前で別のファイル名拡張子を持つ隠しファイルを同じディレクトリに作成することで、これに対処します。このファイルにユーザーの名前が書き込まれ、ファイルがロックされていることを検出したすべてのプロセスで使用できます。同じことができます。 Environment.UserName が適しています。

于 2010-02-20T13:28:47.237 に答える