سؤال

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

if (!Directory.Exists(serverDirectory)) { 
    throw new InstallException("Specified path does not exist or ..."); 
} 

جميلة الفانيليا - وفي تطبيق وحدة التحكم، directory.exists () رمز يعمل كما هو متوقع. ومع ذلك، في سياق MSI، لا يفعل ذلك. على وجه التحديد، الدعوة إلى directory.exist. دائما فشل عند استخدام مورد شبكة. الوثائق ل directory.exist. لا تشير إلى ذلك لماذا:

الطريقة الموجودة لا تؤدي مصادقة الشبكة. إذا قمت بالاستعلام عن مشاركة شبكة موجودة دون أن تكون مصادقة مسبقا، فستظهر الطريقة الموجودة كاذبة.

أدت عمليات البحث إلى سيناريوهات مماثلة أخرى في ASP.NET حيث الانتحال هو الحل. هذا لا ينطبق هنا، لكنه يوضح القضية.

كيف يمكنني التحقق من وجود مسار الشبكة؟ لوضع لغة الوثائق - كيف يمكنني المصادقة قبل المكالمة؟ يقوم المستخدم بتثبيت كمسؤول، وتتصفح هذا المسار في Windows Explorer يعمل بنجاح، لذلك فهذا ليس أذونات المستخدم، بل عدم التحقق من فحص التعليمات البرمجية.

لقد قمت بإنشاء مصدر قلق غير ضروري - هل يجب علي حذف هذا ورمي الاستثناء لاحقا عند محاولة استخدام مورد الشبكة ... إنه في حد كبير نفس الفشل الحرج، أليس كذلك؟

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

المحلول

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

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

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

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