現在オフラインです。再接続するためにインターネットの接続を待っています

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

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB: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  250HANDLE  hFile     = INVALID_HANDLE_VALUEDWORD   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 - 最終更新日: 07/25/2011 03:21:00 - リビジョン: 3.0

  • kbkernbase kbprb kbfileio kbmt KB316609 KbMtja
フィードバック