質問

時々書き込み中のファイルから読み取る必要があり、その結果ロックされているアプリケーションがあります。他の方からも分かりましたように 質問 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)){...}

コンストラクタの最後の国旗は、他のプロセスがファイルで何ができるかについて説明します。あなたは両方の書き込みを制御して読めば、それは、もちろん、大丈夫です...

(bezieurによって記載されているように)

あなたがそれを開くことができ、その後のセクション(またはファイル全体)をロックしてみてください。 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));
scroll top