كيف يمكنني مشاهدة ملف user.config وإعادة تحميل الإعدادات عندما تتغير؟

StackOverflow https://stackoverflow.com/questions/884260

  •  22-08-2019
  •  | 
  •  

سؤال

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

جيم:\المستندات والإعدادات\اسم المستخدم\الإعدادات المحلية\بيانات التطبيق\اسم الشركة\اسم الملف.exe_StrongName_التجزئة\1.0.0.0

على سبيل المثال، C:\Documents and Settings\usename\Local Settings\Application Data\Company\5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko\1.0.0.0

هل هناك طريقة بالنسبة لي للحصول على هذا المسار الكامل (بما في ذلك التجزئة) حتى أتمكن من إضافة مراقب ملف إلى ملف user.config؟

إذا كان الأمر كذلك، أريد إعادة تحميل الإعدادات عندما يتغير الملف.هل الأمر سهل مثل استدعاء هذه الطريقة؟

Properties.Settings.Default.Reload();
هل كانت مفيدة؟

المحلول

لقد وجدت ذلك.سيعيد التعليمة البرمجية التالية المسار إلى ملف user.config.تحتاج إلى إضافة مرجع إلى System.Configuration.dll

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
string path = config.FilePath;

الآن يمكنني استخدام أ FileSystemWatcher ليتم إعلامك عند تغيير الملف.

نصائح أخرى

يجب عليك تخزين الملف مؤقتًا وتنفيذ CacheDependency بحيث إذا تم إجراء أي تغيير على الملف، فسيتم إعادة تحميل الملف في ذاكرة التخزين المؤقت.أنا أستخدم ملف إذن xml في تطبيقي والذي يتم تخزينه في ذاكرة التخزين المؤقت وإعادة تحميله في حالة تغيير الملف.إليك الكود:

protected void Page_Load(object sender, EventArgs e)
{
        XmlDocument permissionsDoc = null;

        if (Cache["Permissions"] == null)
        {
            string path = Server.MapPath("~/XML/Permissions.xml");
            permissionsDoc = new XmlDocument();
            permissionsDoc.Load(Server.MapPath("~/XML/Permissions.xml"));
            Cache.Add("Permissions", permissionsDoc,
                            new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                           Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                    CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
        }
        else
        {
            permissionsDoc = (XmlDocument)Cache["Permissions"];
        }
}

private void ReloadPermissionsCallBack(string key, object value, CacheItemRemovedReason reason)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(Server.MapPath("~/XML/Permissions.xml"));
        Cache.Insert("Permissions", doc ,
                            new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                           Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                    CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
    }

سيؤدي التخزين المؤقت أيضًا إلى زيادة أداء التطبيق الخاص بك.

هل يمكنك استخدام عنصر التحكم fileSystemWatcher؟

يحتوي على حدث معدّل يمكنك تشغيله

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