6

基本的に、このポスターと同じ問題がありますが、C# で:ファイルが Win32 で読み取り可能になるまで待機しています

詳細情報:File.Openプロジェクトの 1 つを呼び出すコードがありますが、ファイルが別のプロセス ( EDIT:またはスレッド)によって既に開かれている場合、時々死ぬことがあります。

FileStream stream = File.Open(m_fileName, m_mode, m_access);
/* do stream-type-stuff */
stream.Close();

File.Openプロパティが( )IOExceptionである (現在、どこかに静かに飲み込まれている)をスローします。私がやりたいことはこれです:HResult0x80070020ERROR_SHARING_VIOLATION

FileStream stream = null;
while (stream == null) {
    try {
        stream = File.Open(m_fileName, m_mode, m_access, FileShare.Read);
    } catch (IOException e) {
        const int ERROR_SHARING_VIOLATION = int(0x80070020);
        if (e.HResult != ERROR_SHARING_VIOLATION)
            throw;
        else
            Thread.Sleep(1000);
    }
}
/* do stream-type-stuff */
stream.Close();

ただし、HResultは の保護されたメンバーでありException、アクセスできません。コードはコンパイルされません。.NET の別の部分にアクセスする別の方法はありHResultますか?

最後にもう 1 つ注意点があります。それは非常識です。Visual Studio 2005 と .NET 2.0 しか使用できません。

4

2 に答える 2

8

Marshal.GetHRForException()内で呼び出して、エラーコードを取得できます。catch振り返る必要はありません:

using System.Runtime.InteropServices;

if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION)
    ....
于 2010-06-29T07:17:20.703 に答える
0

残念ながら、最善の策はリフレクションを使用することです。もちろん、試行の合間に 1 秒間スリープするため、パフォーマンス コストはほとんど見過ごされます。

于 2010-06-29T07:08:53.007 に答える