PRB: CreateFile 関数が失敗したとき ERROR_SHARING_VIOLATION エラー メッセージ

文書翻訳 文書翻訳
文書番号: 316609
すべて展開する | すべて折りたたむ

現象

FILE_SHARE_READ フラグと FILE_SHARE_WRITE フラグ、ファイルを開くときに、 CreateFile 関数は失敗し、次のエラー メッセージを返す可能性があります。
ERROR_SHARING_VIOLATION (エラー コード 32)

状況

この動作は仕様です。

詳細

使用してファイルを開いたときに、 CreateFile またはを使用している関数 CreateFile 内部的には、共有違反のため、予期しないエラーが発生する場合があります。ファイルを特定のアプリケーションのみを指定する場合、同時にファイルにアクセスしようとして可能性があります可能性のある他のプロセスです。この問題が発生するその他のサード ・ パーティ製アプリケーションと共通のシステム コンポーネントです。共通のシステム コンポーネントとサード パーティ製のアプリケーションが (ウイルスなどソフトウェア) は、この問題が発生します。

Microsoft Windows オペレーティング システムを同時に実行する多くのアプリケーションの外観を与える、プリエンプティブ、マルチプロセッサ システムです。特定のアプリケーションは、システム上で実行している唯一のプロセスではないことと、リソースが他のプロセスについては「注意」でなければなりません。リソース処理のために発生する可能性があります問題を解決する必要があります。ファイルの場合は、その実行中のプロセスは、リソースを使用しようとする権利を持ちます。常にシステムのコンポーネントおよびサードパーティのサービスを同時にリソースの競合が発生します。ときアプリケーションは、アプリケーションを他のプロセスと競合して、システムでのファイルにアクセスしようとします。

2 つの一般的な原因は、ERROR_SHARING_VIOLATION のとおりです。
  • 特定のファイルをディスク (一般的な共有データ ファイル) を使用して複数のアプリケーションがあります。アプリケーションは現在、2 番目のアプリケーションが同じファイルにアクセスしようとしました、互換性のない方法でファイルにアクセスしています。たとえば、ファイルを更新することができますが別のプロセスがファイルを書き込んでいる現在とのみ (FILE_SHARE_READ) を読み取り用にファイルを共有しています。
  • ファイル、データ ファイル、アプリケーション固有ですし、ファイルを開くには、別のアプリケーションがしません。このシナリオでは、他のプロセスが短時間の他の理由でファイルをロックする可能性があります。
ユーティリティと、ウイルス検出プログラム、バックアップ ・ ソフトウェア、または短時間のディスク上のファイルをロックするディスク オプティマイザーをなど、最も一般的な問題を発生します。他のアプリケーションを使用してもいっぱい入れた共有でファイルを開くしようとすると、共有違反で失敗します。サービス時間の操作でファイルへの排他アクセス必要があるありますので、この結果を期待できます。この問題を解決するには、短時間後で再試行します。多くの場合、サービスは、ファイルの時間をミリ秒単位で完了です。

2 つの原因は、上記の違反を共有も同様に処理する必要があります。ファイルを開くと、システムのユーザーには影響せず、システムのクラッシュが発生するように、安全な方法で、共有違反を常に処理できなければなりません。これは、単純な再試行のメカニズムを使用して実行できます。ファイルのロックが解除される前に何度か再試行を実行する必要があります。

次のサンプル コードはこの方法を示しています。
#define MAXRETRIES  5
#define RETRYDELAY  250

HANDLE  hFile     = INVALID_HANDLE_VALUE
DWORD   dwRetries = 0;
BOOL    bSuccess  = FALSE;
DWORD   dwErr     = 0;

do
{
    hFile = CreateFile( szFile,
                        GENERIC_READ,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
    if ( INVALID_HANDLE_VALUE == hFile )
    {
        dwErr = GetLastError();

        if ( ERROR_SHARING_VIOLATION == dwErr )
        {
            dwRetries += 1;
            Sleep(RETRYDELAY);
            continue;
        }
        else
        {
            // An error occurred.
            break;
        }
    }

    bSuccess = TRUE;
    break;
} while ( dwRetries < MAXRETRIES );

if  ( bSuccess )
{
    // You succeeded in opening the file.
}
else
{
    // Failure occurs. Do graceful error handling.

    // Here, you must notify the user of the failure.

MessageBox( NULL,
            "Tried to update data file but it was already in use",
            "Update error...",
            MB_OK | MB_ICONSTOP );

    // You also want to put the software back in the state it was in
    // on entrance of the current function, as if the user had never
    // tried to do the update.

    // This may also require deallocating any resources that were
    // allocated because of this operation.
}
				
正常に、共有違反のエラーを処理するためには、このメソッドを完了する時間を開く、ファイルを持つアプリケーションを示します。共有違反のエラーが表示されるたびにアプリケーションを許可する必要があります。 スリープ しばらくしてからもう一度実行してください。ウイルス検出プログラムまたはシステム サービスがある場合は、ファイルを開くとき、ウイルス検出プログラムまたはシステム サービスは、1 つまたは 2 つの再試行後が完了しないことがします。無限ループを避けるために、再試行の回数を制限することを確認してください。他のアプリケーション現在がファイルを開いているファイルを長時間開いたまま可能性がありをユーザーに通知して、ループから抜け出す必要がしが正常に終了します。

プロパティ

文書番号: 316609 - 最終更新日: 2011年7月25日 - リビジョン: 3.0
キーワード:?
kbkernbase kbprb kbfileio kbmt KB316609 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:316609
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com