書き込み中のファイルから読み取る必要があり、その結果ロックされているアプリケーションがあります。他の質問から理解したように、IOException をキャッチして、読めるまで再試行する必要があります。
しかし、私の質問は、ファイルがロックされていること、および発生した別の IOExcetpion ではないことをどのように確実に知ることができるかということです。
書き込み中のファイルから読み取る必要があり、その結果ロックされているアプリケーションがあります。他の質問から理解したように、IOException をキャッチして、読めるまで再試行する必要があります。
しかし、私の質問は、ファイルがロックされていること、および発生した別の IOExcetpion ではないことをどのように確実に知ることができるかということです。
.NETで読み取るためにファイルを開くと、ある時点で、失敗した理由を確認するために使用できるエラーコードを設定するCreateFileAPI関数を使用してファイルハンドルを作成しようとします。
const int ERROR_SHARING_VIOLATION = 32;
try
{
using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
{
}
}
catch (IOException ex)
{
if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
{
Console.WriteLine("The process cannot access the file because it is being used by another process.");
}
}
あなたが本当に読むべきグーグルグループに関する有用な議論があります。オプションの1つは、darinのものに近いものです。ただし、正しいwin32エラーが発生することを保証するには、実際にwin32 OpenFile()APIを自分で呼び出す必要があります(そうしないと、取得しているエラーが実際にはわかりません)。
もう1つは、エラーメッセージを解析することです。アプリケーションを別の言語バージョンで実行すると失敗します。
3番目のオプションは、実際のHRESULTをフィッシュアウトするために、リフレクションを使用して例外クラス内をハックすることです。
選択肢はどれもそれほど魅力的ではありません。IOException階層は、さらにいくつかのサブクラスIMHOの恩恵を受けます。
それを開いて(bezieurの説明に従って)、セクション(またはファイル全体)をロックしてみてください: http://www.java2s.com/Code/VB/File-Directory/Lockandunlockafile.htm
データを読み取るには、次のことができます。
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) { .... }
ファイルに保存するには:
using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.Read | FileShare.Delete)) { ... }
コンストラクターの最後のフラグは、他のプロセスがファイルに対して実行できることを示します。もちろん、書き込みと読み取りの両方を制御できれば問題ありません...