2009-12-08 7 views
6

हालांकि .NET कॉन्फ़िगरेशन फ़ाइलों के बारे में बहुत सी पोस्ट हैं, मुझे विश्वास है कि मेरी आवश्यकताएं प्रस्तावित समाधानों में से किसी एक के लिए अनुमति नहीं देती हैं (या मैं इसे मेरे लिए काम करने के लिए पर्याप्त प्रक्रिया को समझ नहीं पा रहा हूं)।सभी एप्लिकेशन डेटा को सहेजने और पुनर्स्थापित करने के लिए .NET कॉन्फ़िगरेशन फ़ाइलों (app.config, settings.settings) का उपयोग कैसे करें?

स्थिति यह है कि मेरे पास एक विंडोज़ फॉर्म एप्लिकेशन है (जैसा कि एक और ऐप भी हो सकता है) जो कुछ उपयोगकर्ता इनपुट फ़ील्ड (जैसे आईपी एड्रेस), साथ ही फॉर्म प्रॉपर्टीज (विंडो साइज इत्यादि) को एप्लिकेशन सेटिंग्स में जोड़ता है (गुणों में>> सेटिंग्स क्षेत्र)। जो मैं समझता हूं, ये सेटिंग्स मेरे प्रोजेक्ट की app.config फ़ाइल में प्रदर्शित की तरह ही हैं, इसलिए मुझे सिस्टम का उपयोग करने में सक्षम होना चाहिए। कॉन्फ़िगरेशन। कॉन्फ़िगरेशन मैनेजर क्लास उन सेटिंग्स में हेरफेर करने के लिए।

मैं क्या करना चाहता हूं कि उपयोगकर्ता को सभी सहेजी गई सेटिंग्स को निर्यात और आयात करने दें। कुछ कस्टम ऑब्जेक्ट के क्रमबद्ध करने या आईएनआई फाइलों के साथ काम करने के बजाय, मैंने सोचा कि एप्लिकेशन को उपयोग करने वाली कॉन्फ़िगरेशन फ़ाइल को केवल सहेजना और प्रतिस्थापित करना आसान होगा।

यह अपेक्षाकृत एक निर्दिष्ट फ़ाइल के लिए वर्तमान सेटिंग्स को बचाने के लिए आसान है:

internal static void Export(string settingsFilePath) 
{ 
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
    config.SaveAs(settingsFilePath); 
} 

हालांकि, एक कॉन्फ़िग फ़ाइल को बहाल वर्तमान सेटिंग्स के ऊपर लिख करने के लिए मुश्किल साबित हो रहा है। ऐसा लगता है कि मैं बहुत

var newConfig = ConfigurationManager.OpenExeConfiguration(settingsFilePath) 

की तरह एक विन्यास फाइल खोल सकते हैं, लेकिन मैं नहीं दिख रहा है कि कैसे पूरी तरह से आयात की गई फ़ाइल के लोगों के साथ वर्तमान config में सेटिंग्स के सभी को बदलने के लिए। [संपादित करें: यह अधिभार .exe का पथ प्राप्त करने वाला है, न कि .config फ़ाइल। यदि बुला कोड कॉन्फ़िग फ़ाइल में एक ही विधानसभाओं को संदर्भित नहीं करती इस तरह से एक exe फ़ाइल खोलने संभवतः एक ConfigurationErrorsException फेंक देते हैं।]

शायद मैं केवल का केवल एक वर्ग को प्रतिस्थापित करने के तरीकों other posts में उल्लिखित उपयोग करने की आवश्यकता कॉन्फ़िगरेशन, और पूरी बात नहीं, लेकिन मुझे नहीं पता कि यह इस बिंदु पर कैसे काम करेगा।

कोई विचार? क्या मैं सही रास्ते पर जा रहा हूं, या क्या मुझे सिर्फ आईएनआई फाइलों (या कुछ और) का उपयोग करना चाहिए?

उत्तर

2

जब से मैं किसी भी अन्य उत्तर प्राप्त नहीं किया था और मेरे पिछले समाधान से खुश नहीं था, मैं फिर से सवाल पूछा, कुछ और अधिक शोध किया है, और एक बेहतर जवाब के साथ आने के लिए सक्षम था। कोड और स्पष्टीकरण के लिए How to load a separate Application Settings file dynamically and merge with current settings? देखें।

1

मुझे नहीं लगता कि संपूर्ण कॉन्फ़िगरेशन फ़ाइल ओवरराइड करना एक अच्छा विचार है। इस फ़ाइल में से कुछ सेटिंग्स में सेटिंग्स को वास्तव में जल्दी से संसाधित किया जा सकता है, इससे पहले कि आपके किसी भी कोड को कुछ भी करने का मौका मिले, यानी .NET CLR के स्टार्टअप से संबंधित।

+0

ऐसा लगता है कि आप पूरी फ़ाइल में हेरफेर करने के बारे में सही नहीं हैं: स्मृति में, कम से कम, "ऐपसेटिंग" की तुलना में कई और अनुभाग हैं जो मुझे लगता है कि मुझे रूचि है। मेरा मतलब क्या है, var currentConfig = ConfigurationManager.OpenExe कॉन्फ़िगरेशन (ConfigUserLevel.PerUserRoamingAndLocal) का प्रयास करें; वर्तमान कॉन्फिग.डंप(); LINQPad में । – Pat

+0

मुझे पता चला है कि यह "ऐपसेटिंग" मान नहीं है जिसे मैं बदलना चाहता हूं, लेकिन "उपयोगकर्ता सेटिंग्स" मान। विशेष रूप से, यह बाल नोड है। – Pat

3

जब से तुम App.config फ़ाइल एक सरल xml फ़ाइल है कि आप एक XDocument में इसे लोड कर सकते हैं:

string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
XDocument doc = XDocument.Load(path); 
//Do your modifications to section x 
doc.Save(path); 
ConfigurationManager.RefreshSection("x"); 

मैं @ पैट की टिप्पणी

+0

अनुशंसा के लिए धन्यवाद, लेकिन आपके द्वारा निर्दिष्ट पथ उपयोगकर्ता सेटिंग्स को बदलने के लिए सही नहीं है। साथ ही, यदि कोई और इसे आजमा देना चाहता है, तो लोड XDocument क्लास की एक स्थिर विधि है, इसलिए सिंटैक्स var doc = XDocument.Load (पथ) है; मैं यह देखने के लिए एक्सएमएल फ़ाइल के अनुभागों को पढ़ने और बदलने का पीछा करना जारी रखूंगा कि यह विधि काम करती है, लेकिन अभी तक कोई भाग्य नहीं है। – Pat

+0

पथ को आपके App.config पर इंगित करना चाहिए जहां मैंने सोचा था कि आप जिस अनुभाग में हेरफेर करना चाहते हैं वह है। – Manu

3
के अनुसार XDocument.Load() कोड को सही

ऐप.कॉन्फिग को लिखना सबसे अच्छा अभ्यास है लेकिन संशोधित उपयोगकर्ता सेटिंग्स को सहेजने के लिए सेटिंग्स फ़ाइल का उपयोग करें। App.config और web.config केवल पढ़ने के लिए केवल मानों के लिए उपयोग किया जाना चाहिए।

+0

ठीक है, लेकिन यह कैसे किया जाता है? मैं पहले से ही एप्लिकेशन के रनों के बीच उपयोगकर्ता इनपुट को जारी रखने के लिए सेटिंग्स फ़ाइल का उपयोग कर रहा हूं, लेकिन मैं उस जानकारी को एक अलग फ़ाइल (आयात/निर्यात) के रूप में कैसे सहेज सकता हूं और उसे पुनर्स्थापित कैसे कर सकता हूं? – Pat

+0

मनु से नीचे दी गई पोस्ट के रूप में, बस इसे एक XML फ़ाइल के रूप में सोचें। – Kenoyer130

+0

फिर, यह कैसे किया जाता है? मेरी समझ यह है कि सेटिंग्स "फ़ाइल" वास्तव में सिर्फ app.config है, क्योंकि यह वह जगह है जहां सेटिंग संग्रहीत की जाती हैं। स्पष्टीकरण? – Pat

0

मैनू के सुझाव को एक्सएमएल के रूप में पढ़ने के लिए धन्यवाद, मैंने this solution को एक साथ हैक किया। (यह केवल पाठ बॉक्स के टेक्स्ट प्रॉपर्टी जैसे तारों के रूप में सहेजे गए गुणों के लिए वर्तमान रूप में काम करता है। उदाहरण के लिए, यदि आप न्यूमेरिक अपडाउन नियंत्रण की वैल्यू प्रॉपर्टी जारी रखते हैं तो यह काम नहीं करेगा।

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <userSettings> 
     <HawkConfigGUI.Properties.Settings> 
      <setting name="FpgaFilePath" serializeAs="String"> 
       <value>testfpga</value> 
      </setting> 
      <setting name="FirmwareFilePath" serializeAs="String"> 
       <value>test</value> 
      </setting> 
     </HawkConfigGUI.Properties.Settings> 
    </userSettings> 
</configuration> 

तो फिर तुम फ़ाइल आयात करें और सेटिंग्स के सभी एप्लिकेशन में बदल रहे हैं (मत भूलना:) यह फाइल करने के लिए एक रास्ता के साथ निर्यात का उपयोग कर बचाने के लिए है, जो की तरह निम्नलिखित एक फ़ाइल का उत्पादन कर काम करता है कुछ बिंदु पर। सेव()। अगर कुछ गलत हो जाता है, तो सेटिंग्स वापस वापस आ जाएंगी।

using System; 
using System.Configuration; 
using System.IO; 
using System.Linq; 
using System.Xml.Linq; 
using System.Xml.XPath; 
using AedUtils; 

namespace HawkConfigGUI 
{ 
    public static class SettingsIO 
    { 
     private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); 

     internal static void Import(string settingsFilePath) 
     { 
      if (!File.Exists(settingsFilePath)) 
      { 
       throw new FileNotFoundException(); 
      } 

      var appSettings = Properties.Settings.Default; 
      try 
      { 
       // Open settings file as XML 
       var import = XDocument.Load(settingsFilePath); 
       // Get the <setting> elements 
       var settings = import.XPathSelectElements("//setting"); 
       foreach (var setting in settings) 
       { 
        string name = setting.Attribute("name").Value; 
        string value = setting.XPathSelectElement("value").FirstNode.ToString(); 

        try 
        { 
         appSettings[name] = value; // throws SettingsPropertyNotFoundException 
        } 
        catch (SettingsPropertyNotFoundException spnfe) 
        { 
         _logger.WarnException("An imported setting ({0}) did not match an existing setting.".FormatString(name), spnfe); 
        } 
        catch (SettingsPropertyWrongTypeException typeException) 
        { 
         _logger.WarnException(string.Empty, typeException); 
        } 
       } 
      } 
      catch (Exception exc) 
      { 
       _logger.ErrorException("Could not import settings.", exc); 
       appSettings.Reload(); // from last set saved, not defaults 
      } 
     } 

     internal static void Export(string settingsFilePath) 
     { 
      var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
      config.SaveAs(settingsFilePath); 
     } 
    } 
} 
+1

मैं जानना चाहता हूं कि क्यों कोई इसे एक बुरा जवाब मानता है और साथ ही कोई भी "अच्छा" उत्तर उत्पन्न करता है। मुझे बस इतना कहना है कि यह कोड * काम करता है * और कोई अन्य कामकाजी समाधान प्रस्तुत नहीं किया गया है। – Pat

+0

वैसे, यह समाधान * app.config फ़ाइल में हेरफेर नहीं करता है। यह user.config के इन-मेमोरी संस्करण को संशोधित करता है जिसे एप्लिकेशन पर फ़ाइल में स्थानांतरित किया जाता है। – Pat