أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

PRB: ظهور رسالة الخطأ ERROR_SHARING_VIOLATION عند فشل دالة CreateFile

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية316609
إخلاء مسؤولية من محتوى قديم في قاعدة المعارف
عن تقديم الدعم التقني لهاو لذلك تظهر هذه المقالة كما هي و لن يتم تحديثها Microsoft تمت كتابة هذه المقالة بخصوص منتجات توقفت
الأعراض
عند فتح ملف مع علامة FILE_SHARE_READ و إشارة FILE_SHARE_WRITE قد تفشل الدالة CreateFile وتقوم بإرجاع رسالة الخطأ التالية:
ERROR_SHARING_VIOLATION (رمز الخطأ 32)
تصريح
يعتبر هذا السلوك حسب التصميم.
معلومات أخرى
عند فتح ملف باستخدام الدالة CreateFile أو أية دالة يستخدم CreateFile داخليًا التي قد تواجه فشل غير متوقع بسبب حدوث انتهاك في مشاركة. حتى إذا كان الملف فقط من أجل تطبيق معين "، توجد العمليات الأخرى التي من المحتمل أن تكون قد تحاول الوصول إلى الملف في نفس الوقت. هناك مكونات النظام الشائعة أيضاً تطبيقات الجهات الأخرى التي تسبب هذه المشكلة. هناك مكونات النظام الشائعة وأيضاً التطبيقات من جهة خارجية (مثل تفحص الفيروسات برامج) التي تسبب هذه المشكلة.

نظام التشغيل Microsoft Windows هو نظام متعدد المعالجة preemptive ، ، التي تعطي مظهر العديد من التطبيقات التي تعمل في نفس الوقت. يجب أن يكون أي تطبيق معين "علم" أنه من غير العمليات فقط التي تعمل على النظام ثم يتم vying للموارد مع العمليات الأخرى. يجب أن يكون معالجة المشاكل التي قد تحدث بسبب معالجة المورد. في حالة التي الملفات، أي عملية قيد التشغيل لها الحق في محاولة استخدام المورد. هناك دائماً مكونات النظام وخدمات جهة خارجية التنافس للموارد في نفس الوقت. عند محاولة أحد تطبيقات الوصول إلى الملفات الموجودة على النظام الذي يزاحم التطبيق مع العمليات الأخرى.

هناك نوعان من الأسباب الشائعة ERROR_SHARING_VIOLATION:
  • هناك العديد من التطبيقات التي تستخدم ملف معين على القرص (ملفات البيانات المشتركة الشائعة). أحد تطبيقات بالوصول إلى الملف بطريقة غير متوافق مع طريقة تطبيق ثاني يحاول الوصول إلى نفس الملف حالياً. على سبيل المثال، قد تحتاج إلى تحديث الملف ولكن عملية أخرى حالياً الكتابة إلى الملف و يتم فقط مشاركة الملف لقراءة (FILE_SHARE_READ).
  • الملف ملف بيانات محددة إلى التطبيق الخاص بك و لا تتوقع أن يقوم تطبيق آخر يكون الملف مفتوحاً. في هذا السيناريو، قد العمليات الأخرى تأمين ملف لمدة قصيرة لأسباب أخرى.
تحدث المشكلة الأكثر شيوعاً عند الأداة المساعدة مثل الفيروسات أو برامج النسخ الاحتياطي أو للمحسن قرص التي تأمين أحد ملفات على القرص لفترة قصيرة. عندما يحاول تطبيق آخر فتح الملف، حتى مع تشغيل مشاركة الكامل ، تفشل المحاولة مع حدوث انتهاك في مشاركة. يمكنك توقع هذه النتيجة لأنه يجب أن يكون لدى الخدمة حق وصول خاص لمدة العملية على الملف. لحل هذه المشكلة، حاول مرة أخرى وقت قصير لاحقاً. عادةً، يتم إكمال الخدمة مع الملف الموجود في أمر بالمللي ثانية.

يجب معالجة كل من الأسباب لمشاركة انتهاكات وصفه سابقاً بشكل مشابه. عند فتح أحد ملفات التي يجب أن معالجة حدوث انتهاك في مشاركة دوماً في آمن بحيث أنك لا تؤثر على مستخدم النظام أو يؤدي إلى تعطل النظام. يمكنك القيام بذلك باستخدام آلية بسيطة إعادة محاولة. قد تحتاج إلى تنفيذ عدة مرات إعادة المحاولة قبل إلغاء تأمين الملف.

يوضح نموذج التعليمات البرمجية التالي هذا الأسلوب:
#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.}				
تعطي هذه الطريقة بأمان لمعالجة خطأ انتهاك مشاركة تطبيق فتح الوقت لإكمال الملف. كل ظهور خطأ انتهاك مشاركة, الذي يجب أن تسمح التطبيق إلى وضع السكون لفترة والوقت ثم حاول مرة أخرى. إذا كان الفيروسات أو خدمة نظام قد الانتهاء فتح الملف أو الفيروسات أو خدمة النظام بعد إعادة المحاولة أو اثنتين. تأكد من تحديد مرات إعادة المحاولة لتجنب حلقة لا نهائية. في حالة تطبيق آخر حالياً فتح الملف (والاحتفاظ قد الملف مفتوحة لمدة طويلة) ، لإعلام المستخدم عن طريق فصل من الحلقة ثم إنهاء بأمان.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 316609 - آخر مراجعة: 11/21/2006 15:34:58 - المراجعة: 1.2

Microsoft Win32 واجهة برمجة تطبيقات

  • kbmt kbfileio kbkernbase kbprb KB316609 KbMtar
تعليقات
&t=">t" async=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write(" >