سؤال

أقوم بما يلي:

  1. نسخ الملف القابل للتنفيذ إلى C:\temp\x.exe

  2. بدء التنفيذ مع System.Diagnostics.Process.Start ثم انتظر العملية للخروج، بشكل متزامن، عن طريق الاتصال WaitForExit على ال Process يعود الكائن Start.

  3. حذف الملف القابل للتنفيذ C:\temp\x.exe

على بعض الآلات، هذا يعمل بشكل رائع، ولكن على الآخرين، الدعوة إلى DeleteFile فشل، لأن الملف لا يزال قيد الاستخدام. لذلك يبدو أن مرة واحدة WaitForExit إرجاع، لا يعني أن النوافذ تتم مع EXE.

ما هي خياراتي هنا؟ الواضح الذي يجب أن أحاول مرة أخرى DeleteFile بضع مللي ثانية لاحقا، في حلقة، حتى تنجح الحذف أو أوقات الحلقة. ولكن هل هناك طريقة نظيفة لانتظار إغلاق ملف من قبل الجميع؟

هل كانت مفيدة؟

المحلول

هناك أسباب قليلة بطريقة لا يزال بإمكانك مغلق exe عندما يتم تنفيذها. يتعين على البعض القيام بالكود الخاص بك والبعض الآخر مع النظام. الأسباب الرئيسية الثانية يمكنني التفكير في الكود الخاص بك سيكون:

كيف تغلق FileStream عند نسخ ملف EXE إلى موقع TEMP، إذا لم يتم إصداره صراحة، فقد يتغير توقيت الإفراج من وقت لآخر.

والثاني موجود على الرغم من أن العملية تتم تنفيذها لا يعني أنها تتم في منظور النظام.

يمكن لأول مرة أن يتجنب المرء الثاني يمكن رصده في قائمة العملية ولكن لا يزال لديك حقيبة من الأقفال المحتملة (برنامجك المنفذ مرتين بالتوازي، وفحص الفيروسات بعض واحد تنظيف مجلد temp يدويا، معالج تنظيف القرص). لذلك أقترح إما إعادة صياغة منطق البرنامج. إذا تمت كتابة الملف التنفيذي في C # قم بتحميل البرنامج الثنائي وتنفيذ البرنامج بدلا من نسخ الملف.

إذا احتاجك لسبب ما لسبب نسخ الملف في كل مرة يتم تنفيذها في تفرخ مؤشر ترابط تنظيف ذو الأولوية منخفضة الأولوية. دعها تحاول التنظيف بعد مكالمة WATEFOREXIT إذا فشل ذلك في محاولة مرة أخرى بعد x milliseconds إذا فشل ذلك مرة أخرى حاول 2x وما إلى ذلك.

يقال إنني أعتقد أنه سيكون (ربما غير مدار) يدعو API للبحث عن أقفال الملفات على مستوى النظام. شخصيا أود فقط أن يكون النظام الرقم نفسه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top