deletefile of exe مباشرة بعد process.waitforexit فشل
-
19-09-2019 - |
سؤال
أقوم بما يلي:
نسخ الملف القابل للتنفيذ إلى
C:\temp\x.exe
بدء التنفيذ مع
System.Diagnostics.Process.Start
ثم انتظر العملية للخروج، بشكل متزامن، عن طريق الاتصالWaitForExit
على الProcess
يعود الكائنStart
.حذف الملف القابل للتنفيذ
C:\temp\x.exe
على بعض الآلات، هذا يعمل بشكل رائع، ولكن على الآخرين، الدعوة إلى DeleteFile
فشل، لأن الملف لا يزال قيد الاستخدام. لذلك يبدو أن مرة واحدة WaitForExit
إرجاع، لا يعني أن النوافذ تتم مع EXE.
ما هي خياراتي هنا؟ الواضح الذي يجب أن أحاول مرة أخرى DeleteFile
بضع مللي ثانية لاحقا، في حلقة، حتى تنجح الحذف أو أوقات الحلقة. ولكن هل هناك طريقة نظيفة لانتظار إغلاق ملف من قبل الجميع؟
المحلول
هناك أسباب قليلة بطريقة لا يزال بإمكانك مغلق exe عندما يتم تنفيذها. يتعين على البعض القيام بالكود الخاص بك والبعض الآخر مع النظام. الأسباب الرئيسية الثانية يمكنني التفكير في الكود الخاص بك سيكون:
كيف تغلق FileStream عند نسخ ملف EXE إلى موقع TEMP، إذا لم يتم إصداره صراحة، فقد يتغير توقيت الإفراج من وقت لآخر.
والثاني موجود على الرغم من أن العملية تتم تنفيذها لا يعني أنها تتم في منظور النظام.
يمكن لأول مرة أن يتجنب المرء الثاني يمكن رصده في قائمة العملية ولكن لا يزال لديك حقيبة من الأقفال المحتملة (برنامجك المنفذ مرتين بالتوازي، وفحص الفيروسات بعض واحد تنظيف مجلد temp يدويا، معالج تنظيف القرص). لذلك أقترح إما إعادة صياغة منطق البرنامج. إذا تمت كتابة الملف التنفيذي في C # قم بتحميل البرنامج الثنائي وتنفيذ البرنامج بدلا من نسخ الملف.
إذا احتاجك لسبب ما لسبب نسخ الملف في كل مرة يتم تنفيذها في تفرخ مؤشر ترابط تنظيف ذو الأولوية منخفضة الأولوية. دعها تحاول التنظيف بعد مكالمة WATEFOREXIT إذا فشل ذلك في محاولة مرة أخرى بعد x milliseconds إذا فشل ذلك مرة أخرى حاول 2x وما إلى ذلك.
يقال إنني أعتقد أنه سيكون (ربما غير مدار) يدعو API للبحث عن أقفال الملفات على مستوى النظام. شخصيا أود فقط أن يكون النظام الرقم نفسه