ファイルロックが解除されるまで待つ最善の方法
-
22-08-2019 - |
質問
時々書き込み中のファイルから読み取る必要があり、その結果ロックされているアプリケーションがあります。他の方からも分かりましたように 質問 IOExceptionをキャッチして、読み取れるまで再試行する必要があります。
しかし、私の質問は、ファイルがロックされていること、および発生した別のIOExcetpionではないことをどのようにして確実に知ることができるかということです。
解決
.NET で読み取り用にファイルを開くと、ある時点でファイル ハンドルを作成しようとします。 ファイルの作成 を設定する API 関数 エラーコード これは、失敗した理由を確認するために使用できます。
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.");
}
}
他のヒント
に関する有用な議論がありますGoogleグループはあなたが本当に読んべきを。選択肢の一つは、ダーリンのに近いです。しかし、あなたは右のWin32エラーが出る保証するために、あなたは本当に(そうでない場合、あなたは本当にあなたが取得しているエラーを知らない)のWin32のOpenFile()APIを自分で呼び出す必要があります。
もう一つは、エラーメッセージ解析することです:アプリケーションが別の言語のバージョンで実行された場合に失敗します。
第三の選択肢は、実際のHRESULTを魚に反射して、例外クラスの内部でハックすることです。
の選択肢のどれも本当に魅力的ではない:にIOException階層は、さらにいくつかのサブクラスの私見の恩恵を受けるだろう。
あなたが行うことができ、データを読み込むには:
新=(のFileStream fsのを使用して FileStreamを(ファイル名、FileMode.Open、 FileAccess.Read、FileShare.ReadWrite | FileShare.Delete)){...}
と、ファイルに保存します:
新=(のFileStream fsのを使用して FileStreamを(ファイル名、をFileMode.APPEND、 FileAccess.Write、FileShare.Read | FileShare.Delete)){...}
コンストラクタの最後の国旗は、他のプロセスがファイルで何ができるかについて説明します。あなたは両方の書き込みを制御して読めば、それは、もちろん、大丈夫です...
あなたがそれを開くことができ、その後のセクション(またはファイル全体)をロックしてみてください。 http://www.java2s.com/Code/VB/File-ディレクトリ/ Lockandunlockafile.htmする
あなたは両方読んで、ファイルへの書き込みをしている意味ですか?または外部アプリケーションは、それへの書き込みをしていること。
あなたが読書をしていると書いている場合は、そして、私はあなたがあなたのためにこれに管理を行うには、あなたがタイムアウトを提供できるようになりますReaderWriteLockクラスを見てみましょう。その場合には異なるスレッド上でそれをやっていると仮定します。
http://msdn.microsoft.com/en -us /ライブラリ/ system.threading.readerwriterlock.aspxする
それ以外のすべてを行う必要が読み取り専用モードでファイルを開くです。そして、あなたは何の問題もないはずます:
fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));
あなたはチェックして見てタイプのIOExceptionと比較することができます。
この
としてif (ex is FileNotFoundException)
あなたは、System.IOのヘルプを検索したい場合があります。 にIOException 。それは別のタイプの例外があるかどうかをチェックするの外では、あなたは、説明のメッセージに見る必要があります。または、SHELL32.DLLへのWin32 API呼び出しを行うに見えるかもしれません。ファイルがロックされているかどうかを確認するためにそこに機能がある場合があります。
また、あなたは絶対にあなたがループを使用することができるまで待機する必要がある場合がありますが、非同期スレッドを使用して待っている間に他のアクションを実行したい場合。