عند CreateDirectory ، إرجاع error_access_denied و "لا ينبغي"
-
30-09-2019 - |
سؤال
يحاول تطبيق Win32 الخاص بي A1 (في الواقع مجموعة من العمليات) استخدامه CreateDirectory
لإنشاء دليل D1 داخل الدليل الأصل P. المسار إلى P هو قيمة TMP
متغير البيئة ، مما يجعل P مكانًا مزدحمًا ولكنه متساهلة بشكل عام. الغالبية العظمى من الوقت ، كل شيء يعمل بشكل جيد ، ولكن ، نادرا ، CreateDirectory
فشل و GetLastError
ثم يعود ERROR_ACCESS_DENIED
, ، المعنى الذي لم يتم توثيقه في هذا السياق.
لقد كتبت تطبيق اختبار A2 الذي لا يفعل شيئًا سوى إنشاء وحذف دليل D2 بأسرع ما يمكن في P ، واخترت اسمًا طويلًا لـ D2 لا يثق به لا يصطدم بأي برنامج آخر يستخدمه أي برنامج آخر . مرة واحدة كل بضع دقائق ، هناك جزء صغير من الثانية التي يحاول خلالها محاولات A2 لإنشاء عائد D2 فقط ERROR_ACCESS_DENIED
الفشل.
A1 ينشغل جدًا خلال P أثناء تشغيله. بينما يعمل A1 و A2 بشكل متزامن ، فإن فترات من ERROR_ACCESS_DENIED
يحدث الفشل بشكل متكرر إلى حد ما ، كما لو كان A1 و A2 يتنافسون على الوصول الحصري إلى P. (أنا متأكد تمامًا من أن A1 لا يستخدم نفس اسم D2. :-)
أنا أميل إلى حد ما إلى أخذها ERROR_ACCESS_DENIED
يعني "حاول مرة أخرى في بضعة ميلي ثانية ، وإذا لم ينجح ذلك بعد بضع محاولات ، استسلم" ، لكنني قلق من أن [A] في بعض الحالات قد يعني شيئًا دائمًا يجب أن أستجدي على الفور ، على الفور ، و [ب] لأنني لا أعرف حقًا ما يحدث ، فقد لا يكون من الممكن إثبات قدر معقول من الوقت لمواصلة المحاولة.
من لديه خبرة في هذا؟ اي نصيحه؟ ذات قيمة معينة في هذه المرحلة ، ستكون أدلة حول سبب ذلك حتى أتمكن من إعادة إنتاج المشكلة بسهولة أكبر.
المحلول
أنت ميت على حق. ال توثيق لا يدرج حتى error_access_denied كرمز خطأ محتمل لتلك الوظيفة ، لذلك قد يكون خطأ.
أود أن أفعل كما تقترح في تنفيذ استراتيجية إعادة المحاولة/التراجع.
بمعنى آخر ، إذا حصلت على هذا الخطأ ، فحاول مرة أخرى ما يصل إلى ثلاث مرات دون أي تأخير (من الواضح توقف في أي وقت هنا إذا حصلت 100 ميلي ثانية ، 500 ميلي ثانية ، 1 ثانية و 2 ثانية).
هذا النوع من الاستراتيجية (التي استخدمتها من قبل) عادة ما يكون حول أي نقص مؤقت في الموارد. إذا كنت لا تزال لا تستطيع إنشاء الدليل بعد 7 محاولات و 3.6+ ثواني ، ربما يمكنك أن تفترض بأمان أنه لن يحدث.
يمكن أن تكون وظيفتك قبيحة مثل (الكود الزائف):
def createMyDir (dirname):
if createDir (dirName) return true;
if createDir (dirName) return true;
if createDir (dirName) return true;
sleep (100)
if createDir (dirName) return true;
sleep (500)
if createDir (dirName) return true;
sleep (1000)
if createDir (dirName) return true;
sleep (2000)
return createDir (dirName);
لكنك قد ترغب في أن تجعلها أكثر أناقة قليلاً:
def createMyDir (dirname):
delay = pointer to array [0, 0, 0, 100, 500, 1000, 2000, -1]
okay = createDir (dirName)
while not okay and [delay] not -1:
if [delay] not 0:
sleep ([delay])
delay = next delay
okay = createDir (dirName)
return okay