コメントからの解決:
アプリケーションのクラッシュは別の問題が原因で発生しました
2つの異なるアプリケーションからファイルを読み書きしています。ファイルの読み取りまたは書き込み中は、常にアプリAまたはBによってロックされ、両方ともを使用しFileShare.None
ます。
私の問題は、リーダーをtry / catchでラップしても、使用行でIOExceptionが発生してアプリケーションがクラッシュすることです(ライターでは発生しません)。
私はまた、他に違いがないと私が信じているキャッチをcatch (IOException ...
作成し、それをより読みやすくしました。
ファイルがロックされているときに無視して、ファイルが使用可能になるまで試行を続ける正しい方法は何ですか?
while (true)
{
try
{
using (FileStream stream = new FileStream("test_file.dat", FileMode.Open, FileAccess.Read, FileShare.None))
{
using (TextReader reader = new StreamReader(stream))
{
// bla bla bla does not matter
}
}
}
catch
{
// bla bla bla does not matter again
}
Thread.Sleep(500);
}
書く
private bool WriteData(string data)
{
try
{
using (FileStream stream = new FileStream("test_file.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
stream.SetLength(0);
using (TextWriter writer = new StreamWriter(stream))
{
writer.Write(data);
}
}
return true;
}
catch
{
return false;
}
}
ファイルが読み取りまたは書き込みのいずれのプロセスでも使用されている場合、私は誰にも共有権(ライターとリーダーの両方の使用)を付与しないことに注意してくださいFileShare.None
。基本的に、ファイルが使用可能になるまで例外を処理します。